POJ 1220 高精度进制转换
题意:
将一个k进制的高精度数字A转换成m进制数B(k,m<=62)
分析:
我本来想把数字先转换成10进制,然后再转换成m进制,觉得太麻烦,于是乎问WZC神犇怎样做简单
他是这样做的:
应用“除n取余法”,我们直接短除A,除数是m
还是举例说明吧:7进制下的35,转换成2进制,就用3除以2,商是1,余数是1
将1*7再加上第二位的5当成第二个数,继续重复以上步骤
说白了了就和10进制的短除法一样,只不过我们在对于每一位短除的处理上采用的是7进制(处理十进制的时候不都是将余数*10加到下一位么~)
这样,这个题目完美解决了~
PS:代码里写了好多没有用的函数,忽略就好~
友情提示:注意将0转换后是否有输出
我在这里wa了好久。。。
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 6 #define N 10000 7 8 using namespace std; 9 10 char cao[1000]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}; 11 12 struct BIGN 13 { 14 int a[N]; 15 }ans; 16 17 int n,p,mod[N],hash[N],m,tt; 18 char s[10000]; 19 20 inline void prt(BIGN &a) 21 { 22 for(int i=a.a[0];i>=1;i--) printf("%d ",a.a[i]); 23 puts(""); 24 } 25 26 inline BIGN operator %(BIGN a,int md) 27 { 28 BIGN c; 29 memset(c.a,0,sizeof c.a); 30 c.a[0]=a.a[0]; 31 int ys=0; 32 for(int i=a.a[0];i>=1;i--) 33 { 34 ys=a.a[i]+ys*n; 35 c.a[i]=ys/md; 36 ys%=md; 37 } 38 mod[++p]=ys; 39 while(c.a[0]>1&&c.a[c.a[0]]==0) c.a[0]--; 40 return c; 41 } 42 43 void prev() 44 { 45 for(int i=0;i<62;i++) hash[cao[i]]=i; 46 } 47 48 void change() 49 { 50 memset(ans.a,0,sizeof ans.a); 51 ans.a[0]=strlen(s+1); 52 for(int i=1;i<=ans.a[0];i++) ans.a[i]=hash[s[ans.a[0]-i+1]]; 53 } 54 55 inline bool check(BIGN &c) 56 { 57 if(c.a[0]==1&&c.a[1]==0) return false; 58 else return true; 59 } 60 61 void go() 62 { 63 scanf("%d%d%s",&n,&m,s+1); 64 printf("%d %s\n%d ",n,s+1,m); 65 change(); 66 p=0; 67 while(check(ans)) ans=ans%m; 68 if(p) while(p) printf("%c",cao[mod[p--]]); 69 else printf("0"); 70 puts(""); 71 puts(""); 72 } 73 74 int main() 75 { 76 prev(); 77 scanf("%d",&tt); 78 while(tt--) go(); 79 system("pause"); 80 return 0; 81 }
没有人能阻止我前进的步伐,除了我自己!