清华大学机试 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; }

浙公网安备 33010602011771号