输入一共有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;
}