这题刚开始自己做的时候不太好理解,这里就给一下自己写的代码啦~

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int T,n,m,la,lb,len,a[1000005],b[1000005];
char s[1000005];
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d %s",&n,&m,&s),len=la=strlen(s),lb=0;
        printf("%d %s\n%d ",n,s,m);
        for (int i=0; i<la; i++) //字符转成数字
            if (s[i]>47 && s[i]<58) a[i]=s[i]-48;
            else if (isupper(s[i])) a[i]=s[i]-65+10;
            else if (islower(s[i])) a[i]=s[i]-97+36;

        for (int x; len;) {
        //这里的len是n进制数的长度,因为只涉及除法,所以数组没有像高精度那样倒序存放,开始的时候下标0为最高位(la-len),下标la为字符串最后一位
            x=0;
            for (int i=la-len; i<la; i++)//从最高位开始往后一位一位做除法
                x=x*n+a[i],a[i]=x/m,x%=m;//n进制数转化为十进制数,再转化为m进制数
            b[lb++]=x;//存储余数(组成m进制数)
            while(len && !a[la-len]) len--;//处理前导零
        }

        for (int i=lb-1; i>=0; i--) //数字转成字符
            if (b[i]>-1 && b[i]<10) printf("%d",b[i]);
            else if (b[i]>9 && b[i]<36) printf("%c",char(b[i]-10+65));
            else printf("%c",char(b[i]-36+97));
        puts("\n");
    }
}
//ASCII码:“0”为 48,“A”为65,“a”为97