任意进制转换

以前写过一些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的数时应该再处理一下。

 

posted @ 2017-01-18 18:29  lxzyzby  阅读(347)  评论(0)    收藏  举报