天才之作-题解 | 10进制 VS 2进制

#include <iostream>
#include <vector>
using namespace std;

string divide(string origin, int x) {
    int remainder=0;
    int n=origin.size();
    for(int i=0;i<n;++i){
        int current=remainder*10+origin[i]-'0';
        origin[i]=current/x+'0';
        remainder=current%x;
    }
    int pos=0;
    while(origin[pos]=='0')pos++;
    return origin.substr(pos);
}
string multiply(string origin, int x) {
    int carry = 0;
    int n = origin.size();
    for (int i = n - 1; i >= 0; --i) {
        int current =  carry + (origin[i] - '0')*x;
        origin[i] = current % 10+'0';
        carry = current / 10;
    }
    if (carry != 0) {
        origin.insert(0, to_string(carry));
    }
    return origin;
}
string add(string origin, int x) {
    int carry = 0;
    int n = origin.size();
    for (int i = n - 1; i >= 0; --i) {
        int current = origin[i] - '0' + carry + (i == n - 1 ? x : 0);
        origin[i] = current % 10+'0';
        carry = current / 10;
    }
    if (carry != 0) {
        origin.insert(0, to_string(carry));
    }
    return origin;
}
int main() {
    string A;
    while (cin >> A) { // 注意 while 处理多个 case
        vector<int> binary;
        while (A.size() != 0) {
            int last = A[A.size() - 1] - '0';
            binary.push_back(last % 2);
            A = divide(A, 2);
        }
        int n = binary.size();
        string B{'0'};
        for (int i = 0; i<n; ++i) {
            B = multiply(B, 2);
            B = add(B, binary[i]);
        }
        cout << B << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

不愿透露姓名的神秘牛友
01-21 22:53
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务