高精度的进制转换: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; }