天才之作-题解 | 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")

全部评论

相关推荐

想run的马里奥在学...:这个学历帮你扫平百分之80的障碍,投就完了,这会找不到就等3月暑期一样能找到
点赞 评论 收藏
分享
01-19 12:48
门头沟学院 C++
只想搞钱的鸽子很喜欢...:混账是很多的,还有那些在自己风华正茂的年纪说风凉话讥讽那些下岗前员工的。这些人都是现在职场环境这么烂的帮凶
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务