大数运算之进制转换

c/c++

浏览数:122

2019-8-9

大数的之间的进制转换不能简单的用取余法来做,这样会导致溢出。以牛客网的这道题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;
} 

作者:闽A2436