这题刚开始自己做的时候不太好理解,这里就给一下自己写的代码啦~
#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