//字符串除法从高位开始考虑 字符串乘法从低位开始考虑,与平时数字计算相似 #include <iostream> #include <string> #include <stack> using namespace std; string Divide(string s, int x) {//一千位的十进制数用字符串处理 int remainder = 0; for (int i = 0; i < s.size(); i++) { int cur = remainder * 10 + s[i] - '0'; s[i] = cur / x + '0'; remainder = cur % x; } int pos = 0; while (s[pos] == '0') { pos++; } return s.substr(pos); } string convertFunc1(string s, int x) {//十转二 stack<int> sck; while (s.size() != 0) { int bit = (s[s.size()-1] - '0') % 2; //整个数%2 和 最后一位%2的结果一样 sck.push(bit); s = Divide(s, x); } string res; while (!sck.empty()) { res.push_back(sck.top()+'0'); sck.pop(); } return res; } string Multiple(string str, int x) { //字符串乘法 用于二转十 实现十进制字符串和十进制整型乘法 int carry = 0; //进位 for (int i = str.size() - 1; i >= 0; i--) {//低位开始考虑 int cur = x * (str[i] - '0') + carry; str[i] = cur % 10 + '0'; carry = cur / 10; } if (carry != 0) { str = "1" + str; //乘2进位只能是1,如果乘大于2的整数,则应加上进位 } return str; } string Add(string str, int x) { //字符串加法 int carry = x; for (int i = str.size() - 1; i >= 0; i--) { int cur = (str[i] - '0') + carry; str[i] = cur % 10 + '0'; carry = cur / 10; } if (carry != 0) { str = "1" + str; //在两个十进制数正常逐位相加时,每一位产生的进位是 0 或者 1 } return str; } string convertFunc2(string s, int x) {//二转十 string ans = "0"; for (int i = s.size() - 1; i >= 0; i--) { //从最低二进制位开始 ans = Multiple(ans, x); ans = Add(ans, s[i]-'0'); } return ans; } int main() { string s; while (cin >> s) { cout << convertFunc2(convertFunc1(s, 2), 2); } return 0; }