思路

简单的进制转换,但是因为数字比较大,所以要使用字符串进行存储,所以难点就在于如何对十进制字符串进行转换。

其中字符串除法是模拟竖式除法,从前往后除,我刚开始的时候开别人的题解就这一点没有明白,举个例子,987654 除以 321,计算步骤如下:

  1. 取被除数前三位(除数长度) - 987,除以321,结果是 3 余 24
  2. 余数 24 后面再加一位被除数 6 -> 246,但发现不够 321 除,结果添 0
  3. 246 再取一位被除数 -> 2465,除以321,结果7 余21
  4. 余数 21 再取一位被除数 -> 2184,除以321,结果是6
  5. 检查被除数已经取完,运行结束,得到结果 3076

图片说明

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

//从 m 进制转换为 n 进制
string conversion(int m, string num, int n){
    int l = num.length(), remain;
    string ans = "";
    // 模拟竖式除法
    for(int i = 0; i < l; ){
        remain = 0;
        for(int j = i; j < l; j ++){
            int temp = (remain * m + num[j] - '0') % n;
            num[j] = (remain * m + num[j] - '0') / n + '0';
            remain = temp;
        }
        ans += char(remain + '0');
        while(num[i] == '0') i ++;
    } 
    reverse(ans.begin(), ans.end());
    return ans;
}
int main(){
    string num, ans;
    while(cin >> num){
        ans = conversion(10, num, 2);
        cout << ans << endl;   
    }
    return 0;
}