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
",from,back);
48     printf("%d ",to);
49     while(count--)
50         putchar(toch[ans[count]]);
51     puts("
");
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/rootial/p/3218836.html