任意进制转换
以前写过一些10以内进制转换的代码,今天想了想,把16进制以内的进制转换写了写
代码如下
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 int a[64],len,lenend; 5 char k[10000],zr[10000]; 6 int pw(int a,int b) 7 { 8 int r=1; 9 while(b) 10 { 11 if(b&1) r*=a; 12 a*=a; 13 b>>=1; 14 } 15 return r; 16 } 17 void zh(int now,char n[])//把字符转换成数字 18 { 19 int len=strlen(n); 20 for(int i=0;i<len;i++) 21 { 22 switch(n[i]) 23 { 24 case 'A':a[i]=10;break; 25 case 'a':a[i]=10;break; 26 case 'B':a[i]=11;break; 27 case 'b':a[i]=11;break; 28 case 'C':a[i]=12;break; 29 case 'c':a[i]=12;break; 30 case 'D':a[i]=13;break; 31 case 'd':a[i]=13;break; 32 case 'E':a[i]=14;break; 33 case 'e':a[i]=14;break; 34 case 'F':a[i]=15;break; 35 case 'f':a[i]=15;break; 36 default : a[i]=n[i]-'0';break; 37 } 38 39 } 40 // for(int i=0;i<len;i++) printf("%d ",a[i]);//注释 41 // printf("\n");//注释 42 return; 43 } 44 int zh1(int now,int m[])//把n进制整数数组转换成十进制 45 { 46 int r=0,ans=0; 47 for(int i=len-1;i>=0;i--) 48 { 49 //printf("%d=%d*%d ",a[i]*pw(now,r),a[i],pw(now,r)); 50 a[i]=a[i]*pw(now,r); 51 r++; 52 ans+=a[i]; 53 // printf("%d \n",ans);//注释 54 } 55 56 return ans; 57 } 58 void zh2(int nowshu,int to)//把十进制转换成m进制 59 { 60 int tot=0,r; 61 while(nowshu>0) 62 { 63 r=nowshu%to; 64 // printf("r=%d ",r);注释 65 switch(r) 66 { 67 case 10:zr[tot]='A';break; 68 case 11:zr[tot]='B';break; 69 case 12:zr[tot]='C';break; 70 case 13:zr[tot]='D';break; 71 case 14:zr[tot]='E';break; 72 case 15:zr[tot]='F';break; 73 default : zr[tot]=r+'0';break; 74 } 75 // printf("zr=%c\n",zr[tot]); 76 tot++; 77 nowshu/=to; 78 } 79 lenend=tot; 80 return ; 81 } 82 void fz(char m1[],int len1)//反转数组 83 { 84 char mn[100]; 85 int tot=0; 86 for(int i=len1-1;i>=0;i--) 87 mn[tot++]=m1[i]; 88 strcpy(m1,mn); 89 } 90 int main() 91 { 92 int n,m; 93 scanf("%d%s%d",&n,k,&m); 94 len=strlen(k); 95 zh(n,k); 96 int sum=zh1(n,a); 97 zh2(sum,m); 98 fz(zr,lenend); 99 zr[lenend]='\0'; 100 printf("%s",zr); 101 return 0; 102 }
分析:
把n进制的一个数转换成m进制的一个数,所以我们不能同10进制以前的转换一样读入一个整数,应当读入一个字符串,这里我们叫做k(字符串)。
我们可以把k的每一位转换成一个int型数组,这里我们把这个int型数组叫做a数组。
我们把十进制当作一个桥梁,把n进制的数转换成10进制的数
再从10进制的数转换成m进制的数,这里m进制的数被转换成一个字符串我们在这里把它叫做zr字符串。
因为10-15需要用字母A-F来表示,所以我们在转换的过程中,处理大于等于10的数时应该再处理一下。

浙公网安备 33010602011771号