点此看题
本篇题解将详细介绍如何进行大数进制转化(实现非常简单,不用高精度)
我们考虑从高位到低位的转化过程,如下图: 然后从小到大地去修改 b b b数组就行了,每个值都乘上 a a a,再维护一个余数(一开始是 m m m),进个位就行了。
#include <cstdio> #include <cstring> const int M = 1005; int read() { int num=0,flag=1;char c; while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1; while(c>='0'&&c<='9')num=(num<<3)+(num<<1)+(c^48),c=getchar(); return num*flag; } int T,A,B,a[M],b[M];char s[M]; int fuck(char c) { if(c>='0' && c<='9') return c-'0'; if(c>='A' && c<='Z') return c-'A'+10; if(c>='a' && c<='z') return c-'a'+36; } char refuck(int c) { if(c>=0 && c<=9) return c+'0'; if(c>=10 && c<36) return c-10+'A'; return c-36+'a'; } signed main() { T=read(); while(T--) { memset(b,0,sizeof b); A=read();B=read(); scanf("%s",s+1); a[0]=strlen(s+1); for(int i=1;i<=a[0];i++) a[i]=fuck(s[i]); for(int i=1;i<=a[0];i++) { for(int j=1,r=a[i];j<=b[0] || r;j++) { b[j]=b[j]*A+r; r=b[j]/B; b[j]%=B; if(j>b[0]) b[0]=j; } } printf("%d %s\n%d ",A,s+1,B); if(b[0]==0) b[0]=1; for(int j=b[0];j>=1;j--) printf("%c",refuck(b[j])); puts("");puts(""); } }