高精度的进制转换: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;
}
京公网安备 11010502036488号