大数的之间的进制转换不能简单的用取余法来做,这样会导致溢出。以牛客网的这道题10进制 vs 2进制 为例,题目给的数字已经达到了1000位,即使用long long类型也没办法存储,所以要用字符数组来存储。然后用模拟手算除法的方式来进行进制转换。
代码如下:
#include<bits/stdc++.h>
using namespace std;
string conversion(int oldbase,string str,int newbase)
{
int len = str.size();
string s;
for(int i = 0;i < len;)
{
int k = 0;
for(int j = i;j < len;j++)
{
int temp = (k*oldbase + str[j] - '0')%newbase;//手算除法得到的余数
str[j] = (k*oldbase + str[j] - '0')/newbase +'0';//手算除法得到的商
k = temp;
}
s += char(k + '0');
while(str[i]=='0') i++;
}
reverse(s.begin(),s.end());
return s;
}
int main()
{
string num;
while(cin >> num)
{
string a = conversion(10,num,2);
reverse(a.begin(),a.end());
num = conversion(2,a,10);
cout << num << endl;
}
return 0;
}