类似题目:http://poj.org/problem?id=1220
高精度进制转换原理:https://www.cnblogs.com/kuangbin/archive/2011/08/09/2132467.html
①利用整型数组存储
参考博客:https://www.cnblogs.com/bhlsheji/p/5104558.html
#include <cstdio> #include <cstring> #include <cctype> using namespace std; const int maxn = 600;//大数的最大位数 char str[maxn];//存储要转换的大数,以字符形式存储 //oldbase:原基数。newbase:新基数。len:大数的长度 pos:下标 int oldbase, newbase, len, pos; //a[maxn]:储存大数的最小整型。注意a[0]没有使用;r[maxn]:储存余数,即所求数的每一位 int a[maxn],r[maxn]; //将字符转换成相应进制的整数 int getNum(char ch){ if(isdigit(ch)) return ch - '0'; else if(isupper(ch)) return ch - 'A' + 10; else return ch - 'a' + 36; } //将相应进制整数转换成相应的字符 char getChar(int i){ if(i >= 0 && i <= 9) return i + '0'; if(i >= 10 && i <= 35) return i - 10 + 'A'; return i - 36 + 'A'; } //调用函数将字符串转化成相应进制的整数。按位转化 void chToNum(){ len = strlen(str);//测量字符串的长度 //遍历每个字符,一一相应转换,注意没有使用a[0] for(int i = 1; i <= len; i++){ a[i] = getNum(str[i - 1]); } } void conversion()//转化函数 { int i; pos = 0; for(i = 1; i <= len;){ int j, k = 0; //对数的每一位除新基数求商求余 for(j = i; j <= len; j++){ k = k * oldbase + a[j];//计算除数 a[j] = k / newbase;//求商 k %= newbase;//求余 } r[pos++] = k;//记录最后一个余数 for(j = 1; j <= len && !a[j]; j++);//去除前导0 i = j; } } //输出函数 void print() { //逆序输出余数,即为结果 while(pos--){ printf("%c", getChar(r[pos])); } printf("\n"); } int main(){ int n; scanf("%d %d %s", &oldbase, &newbase, str); chToNum();//字符串转换为整型 conversion();//转化 print();//函数调用输出结果 return 0; }
①利用字符串存储
参考博客:https://blog.nowcoder.net/n/c514fef730cf40dc946117c6def48c8b
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <cctype> #include <algorithm> using namespace std; int getNum(char ch){ if(isdigit(ch)) return ch - '0'; if(isupper(ch)) return ch - 'A' + 10; return ch - 'a' + 36; } char getChar(int i){ if(i <= 9) return i + '0'; if(i >= 10 && i <= 35) return i - 10 + 'A'; return i - 36 + 'a'; } string convert(int m, string a, int n){ string res; while(a.size() != 0){ int rem = 0; for(int i = 0; i < a.size(); i++){ int tmp = rem * m + getNum(a[i]); a[i] = getChar(tmp / n);//求商 rem = tmp % n;//取余 } res += getChar(rem); int pos = 0; while(a[pos] == '0'){ pos++; } a = a.substr(pos); } reverse(res.begin(), res.end()); return res; } int main(){ int m, n; string a; while(cin >> m >> n >> a){ cout << convert(m, a, n) << endl; } return 0; }