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 }

 

posted @ 2012-10-11 19:11  proverbs  阅读(722)  评论(0编辑  收藏  举报