进制转换模板
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]='\0'; 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("\n"); 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\n",NewData); 43 } 44 }
转载请注明出处:https://dilthey.cnblogs.com/

浙公网安备 33010602011771号