清华大学机试 10进制 VS 2进制 需要二刷 *字符串大数问题,一定要注意下

基本思想:

启发的点有两个:

1.对于取余判断,直接判断最后一位即可;

2.对于二进制转十进制,可以每次加和一位乘2;

 

关键点:

无;

 

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


string devide(string s, int x) {
    int r = 0;
    for (int i = 0; i < s.size(); i++) {
        int temp = (s[i] - '0') + r * 10;
        s[i] = (temp / x) + '0';
        r = temp % x;
    }
    //去除前导零;
    while (s.size() > 0 && s[0] == '0')
        s.erase(0, 1);
    return s;
}

string multi(string s, int x) {
    //进行乘;
    int carry = 0;
    for (int i = s.size() - 1; i >= 0; i--) {
        int temp = carry + (s[i] - '0')*x;
        s[i] = temp % 10+'0';
        carry = temp / 10;
    }
    while (carry != 0) {
        s = "1" + s;
        carry /= 10;
    }
    return s;
}

string ten2bin(string s) {
    string binstr = "";
    while (s.size()>0) {
        binstr.push_back(s[s.size()-1] % 2 + '0');
        s = devide(s, 2);
    }
    return binstr;
}

string add(string s,int x) {
    int carry = x;
    for (int i = s.size() - 1; i >= 0; i--) {
        int temp = (s[i] - '0') + carry;
        s[i] = temp % 10 + '0';
        carry = temp / 10;
    }
    if (carry != 0)
        s = "1" + s;
    return s;
}

int main() {
    string s;
    while (cin >> s) {
        //需要先转换为2进制;
        string binstr = ten2bin(s);
        //获得反向二进制串;
        while (binstr.size() > 0 && binstr[0] == '0')
            binstr.erase(0, 1);
        //去除前导零;
        string answer = "0";
        for (int i = 0; i < binstr.size(); i++) {
            answer = multi(answer, 2);
            answer = add(answer, binstr[i] - '0');
        }
        //再从2进制转化为10进制;
        cout << answer << endl;
    }
    return 0;
}

 

posted @ 2020-03-05 20:48  暮云林凌  阅读(177)  评论(0)    收藏  举报