高精度的进制转换:https://www.cnblogs.com/kuangbin/archive/2011/08/09/2132467.html
编写一个进制转换函数,由转换过程可知,保存大数求模的数组已经是逆序的,只要删除数组开头连续的0,再用进制转换函数转换为10进制即可。代码如下:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MaxSize 1001
//m代表转换前的原始进制,a代表转换的字符串,n为转换后的目标进制
string conversion(int m, string a, int n){
    int l = a.size(), k = 0;
    string b;
    //只要被除数仍然大于等于1,那就继续模n取余
    for(int i = 0; i < l;){
        k = 0;
        //12345 / 2 变成  06172 那么下次跳过了数字为 0 的下标,从 6 开始 ,但是下标总是以 n 结束
        for(int j = i; j < l; j++){
            int t = (k * m + a[j] - '0') % n;//当前余数t=被除数(上一轮的余数k*转换前进制m+当前位上的数a[j]) % 转换后的目标进制n
            a[j] = (k * m + a[j] - '0') / n + '0';//a[j]赋值为商
            k = t;//更新上一轮的余数k为当前余数t
        }
        b += char(k + '0');//这一轮运算得到的余数k
        while(a[i] == '0') i++;//跳过这一次产生的高位的0,找到下一轮商的起始位置
    }
    return b;
}
int main(){
    string a, b, c;
    while(cin >> a){
        b = conversion(10, a, 2);
        a = conversion(2, b, 10);  
        reverse(a.begin(), a.end());
        cout << a << endl;
    } 
    return 0;
}

利用string中的substr函数:

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
string convert(int m, string a, int n)
{
    string res = "";
    while (a.size() > 0)
    {
        int rem = 0;
        int i;
        for (i = 0; i < a.size(); i++)
        {
            int tmp = m * rem + (a[i] - '0');
            a[i] = tmp / n + '0';
            rem = tmp % n;
        }
        res += char(rem + '0');
        int pos = 0;
        while (a[pos] == '0')
            pos++;
        a = a.substr(pos);
    }
    return res;
}
int main()
{
    string a, b, c;
    while (cin >> a)
    {
        b = convert(10, a, 2);
        c = convert(2, b, 10);
        reverse(c.begin(), c.end());
        cout << c << endl;
    }
    return 0;
}