输入一共有3行,分别是原始数据的进制(int n),原始数据的表示(string s)和目标数据的进制(int m)
可以选择先将其转化为10进制数在从小到大依次进位
//由此方法将原始数据转换为10进制数
long long trans(int n, string s) {
long long ans = 0;
int len = s.length();
//从头往后读 前面大后面小
for (int i = 0; i < len; i++) {
if (s[i] >= 48 && s[i] <= 57) {
//注意下pow(n,len-i-1) 这东西让我WA了3次
ans += (s[i] - 48) * pow(n, len - i - 1);
} else
ans += (s[i] - 55) * pow(n, len - i - 1);
}
return ans;
}
题目指出数据必定小于10进制下的10^9 我们就知道这数据再怎么大,再怎么长他撑死了不超过32位
开一个32位的数组便可
AC代码
#include <bits/stdc++.h>
using namespace std;
long long a[32];
long long trans(int n, string s) {
long long ans = 0;
int len = s.length();
for (int i = 0; i < len; i++) {
if (s[i] >= 48 && s[i] <= 57) {
ans += (s[i] - 48) * pow(n, len - i - 1);
} else
ans += (s[i] - 55) * pow(n, len - i - 1);
}
return ans;
}
int main() {
int n, m;
string s;
cin >> n >> s >> m;
a[0] = trans(n, s);
for (int i = 0; i < 31; i++) {
a[i + 1] = 0;
//进位
while (a[i] >= m) {
//这种方法最快.写a[i]-=m;a[i+1]++;也彳亍 只不过TLE了结果是对的(
int t = (a[i] - a[i] % m) / m;
a[i] %= m;
a[i + 1] += t;
}
}
//用于去除前导0
int flag = 0;
for (int i = 31; i >= 0; i--) {
if (a[i] >= 0 && a[i] <= 9)
a[i] += 48;
else
a[i] += 55;
if (a[i] != 48 && flag == 0) {
printf("%c", a[i]);
flag = 1;
} else if (flag == 1)
printf("%c", a[i]);
}
return 0;
}