关键在于对于字符串模拟的数字,不断的进行对2取模,对2整除的运算,即可求出结果。

对于取模运算,可以转换为对字符串低位进行取模的运算,二者功能上是等价的。

对于整除运算,需要重写一个函数来完成字符串除法的功能。将字符串从高到低逐位除以除数,如果某位不能整除,那么就保留该位数除以除数的余数,余数乘以10以后和低一位的一起进行处理。这样就可以模拟出除法的效果,但是也会导致出现多个前置0。

#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 convertFunc(string s, int x) {
    stack<int> sck;
    while (s.size() != 0) {
        int bit = (s[s.size()-1] - '0') % 2;
        sck.push(bit);
        s = Divide(s, x);
    }
    string res;
    while (!sck.empty()) {
        res.push_back(sck.top()+'0');
        sck.pop();
    }
    return res;
}

int main()
{
    string s;
    while (cin >> s) {
        cout << convertFunc(s, 2) << endl;
    }
    return 0;
}