POJ_1220_Nmber Sequence
上网查了一下进制转换的算法,发现一个性能比较好的:m进制转换成n进制,先用例如62进制ABC转换成10进制,就是用余位c(第一个数余位数值为0)乘以原基数from,加上A表示的数值,然后得到一个数,对to(要转换的进制)取商替换字符A,注意要用相应字符替换相应位这里是s[0],然后取模作为计算下位时的余位,当计算到最后一位时把余位存起来,因为这就是要准换成的数字的第一位,最后逆序输出就行。最终直到s字符串所有位都是0,反复操作过程中可以改变遍历的下限也就是从第一个不为0的地方开始乘基数取模。
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #define N 10010 4 5 char s[N],back[N]; 6 7 int to_10(char ch) 8 { 9 if(ch<='9') 10 return ch-'0'; 11 if(ch<='Z') 12 return ch-'A'+10; 13 return ch-'a'+36; 14 } 15 16 char toch[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 17 int ans[N]; 18 19 int main(void) 20 { 21 int tcase,from,to; 22 scanf("%d",&tcase); 23 while(tcase--) 24 { 25 scanf("%d%d%s",&from,&to,s); 26 strcpy(back,s); 27 int i,c=0,t,count=0,low=0,tag=0; 28 int len=strlen(s); 29 while(1) 30 { 31 if(low==len)// 32 break; 33 c=tag=0; 34 for(i=low; i<len; i++) 35 { 36 t=c*from+to_10(s[i]); 37 s[i]=toch[t/to]; 38 if(t/to) 39 tag=1; 40 if(!tag&&t/to==0) 41 low=i+1; 42 c=t%to; 43 if(i==len-1) 44 ans[count++]=c; 45 } 46 } 47 printf("%d %s\n",from,back); 48 printf("%d ",to); 49 while(count--) 50 putchar(toch[ans[count]]); 51 puts("\n"); 52 } 53 return 0; 54 }