进制转换模板

 1 #define MAXN 20
 2 int t[MAXN],A[MAXN],n;
 3 char OldData[MAXN],NewData[MAXN];  //转换前、后的数据
 4 int olds,news;                     //转换前、后的进制
 5 void trans()//调用方式:输入olds、news、OldData,然后调用trans(),输出NewData
 6 {
 7     int i,len,k;
 8     len=strlen(OldData);
 9     for(i=len;i>=0;i--) t[len-1-i] = OldData[i] - (OldData[i]<='9' ? 48 : (OldData[i]<'a' ? 55 : 61));//将字符串转化成0~61 
10     for(k=0;len;)
11     {
12         for(i=len;i>=1;i--)
13         {
14             t[i-1]+=t[i]%news*olds;
15             t[i]/=news;
16         }
17         A[k++]=t[0]%news;
18         t[0]/=news;
19         while(len>0 && !t[len-1]) len--;
20     }
21     NewData[k]='';
22     for(i=0;i<k;i++) NewData[k-1-i] = A[i] + (A[i]<10 ? '0' : (A[i]<36 ? 55 : 61));
23 }

最大62进制:[0~9,A~Z,a~z]

原理:

例如我们将10进制的5031转换成2进制:

使用这种不断除二取余的方法,我们就可以得到2进制数:1001110100111

同样的,我们对于任意的两个进制间的转换也使用这种方法,例如将16进制的15BDE转换成8进制的:

在这里,我们要把B(11)、D(13)、E(14)都看作一位,并且除法中高位的余数,加到低位上时,不再是乘10,而是乘16,

例如最后15/8时,1/8=0余1,这时5+(1*16)=21,21/8=2余5,就在右边写上5即可。

而上面那个模板的算法,就是模拟这种计算过程。

用更加通俗易懂的方式来重写上面那个模板:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stack>
 4 #define MAXN 20
 5 using namespace std; 
 6 stack<int> ans;
 7 int t[MAXN],n;
 8 char OldData[MAXN],NewData[MAXN];  //转换前、后的数据
 9 int olds,news;                     //转换前、后的进制
10 void trans()//调用方式:输入olds、news、OldData,然后调用trans(),输出NewData
11 {
12     int i,len,k=0;
13     len=strlen(OldData);
14     for(i=len-1;i>=0;i--) t[len-1-i] = OldData[i] - (OldData[i]<='9' ? 48 : (OldData[i]<'a' ? 55 : 61));//将字符串转化成0~61 
15     while(len)
16     {
17         for(i=len-1;i>=1;i--)
18         {
19             t[i-1]+=t[i]%news*olds;
20             t[i]/=news;
21         }
22         ans.push(t[0]%news);//得到一个余数,放入结果栈
23         t[0]/=news;
24         //for(i=len-1;i>=0;i--) printf("%d ",t[i]); printf("
");
25         while(len>0 && !t[len-1]) len--;//去掉做完除法后,前面那些零 
26     }
27      
28     int cnt=0;
29     while(!ans.empty())
30     {
31         NewData[cnt++] = ans.top() + (ans.top()<10 ? '0' : (ans.top()<36 ? 55 : 61));
32         ans.pop(); 
33     }
34 }
35 int main()
36 {
37     while(1)
38     {
39         scanf("%s",OldData);
40         scanf("%d%d",&olds,&news);
41         trans();
42         printf("%s
",NewData);
43     }
44 } 
原文地址:https://www.cnblogs.com/dilthey/p/7141714.html