#include <iostream> #include <string> #include <vector> #include <algorithm> #include <stack> #include <map> #include <queue> #include <cmath> using namespace std; queue<int> que; /** 大数除法 str 一个十进制的大数 x 除数 return 余数 */ int divide(string& str, int x) { int size = str.size(); int remainder = 0; //上一轮的余数 for (int i = 0; i < size; i++) { int cur = str[i] - '0' + remainder * 10; //当前位置的值 if (cur / x == 0) { //这一位不够除, 结果上0 str[i] = '0'; remainder = cur; } else { //这一位够除 int t = cur / x; str[i] = '0' + t; remainder = cur % x; } } //有可能前面有很多0,要去掉 int index; for (index = 0; index < size; index++) { if (str[index] != '0') { break; } } str = str.substr(index); return remainder; } /** str 十进制的字符串 return 对应翻转的二进制字符串 */ string decToBin(string str) { while (true) { if (str == "") { break; } int t = divide(str, 2); que.push(t); } string bin = ""; while (!que.empty()) { int t = que.front(); que.pop(); bin += t + '0'; } //翻转以后前面可能有0,要去掉 int index; for (index = 0; index < bin.size(); index++) { if (bin[index] != '0') { break; } } bin = bin.substr(index); return bin; } /** 字符串乘法 str 乘数1 x 乘数2 return 返回相乘的结果 */ void mul(string& str, int x) { //在这里x就是为2 //从末尾开始乘 int carry = 0; //进位 for (int i = str.size() - 1; i >= 0; i--) { int cur = str[i] - '0'; //当前位的值 cur = cur * x + carry; if (cur < 10) { str[i] = cur + '0'; carry = 0; } else { //有进位 carry = 1; str[i] = cur - 10 + '0'; } } if (carry == 1) { str.insert(0, 1, '1'); } } /** 字符串加法 str 加数1 X 加数2 其实就是1 或者 0 */ void plus1(string& str, int x) { if (x == 0) { return; } else { int carry = 0; for (int i = str.size() - 1; i >= 0; i--) { int cur = str[i] - '0'; //当前位的值 cur = cur + x + carry; if (cur < 10) { str[i] = cur + '0'; carry = 0; break; } else { //有进位 carry = 1; str[i] = cur - 10 + '0'; } } if (carry == 1) { str.insert(0, 1, '1'); } } } /** 二进制换成十进制 bin 二进制字符串 return 对应的十进制 */ string binToDec(string bin) { string ret = "0"; for (int i = 0; i < bin.size(); i++) { mul(ret, 2); //先乘2 int x = bin[i] - '0'; plus1(ret, x); //再相加 } return ret; } int main() { string dec; //十进制 while (getline(cin, dec)) { //此时bin为dec的翻转二进制 string bin = decToBin(dec); string ret = binToDec(bin); printf("%s\n", ret.c_str()); } }