任意进制整数之间的相互转换(C++实现)

任意进制整数之间的相互转换经常出现在各大IT公司的笔试面试中,这里我对其中的算法和实现代码做个总结。

 

算法思想:例如,要求将x1进制的数r1转化成为x2进制的数r2,首先应该将r1转化为十进制的数r_decimal,然后再将十进制数r_decimal转化为x2进制的数r2。(1<x1<17&&1<x2<17)

下面是我用C++实现的代码,已经在visual C++ 6.0上测试通过了,程序没有考虑太多的细节(整数和进制合法性的判断等),主要是为了实现算法的思想,如果想做的再好一点,个人感觉应该用类实现,将整数封装成class。

例如,

class Number

{

private:

    string num;

    int binary;

public:

    /*构造函数*/

    Number(string num,int binary);//包含对数据合法性的检查

    Number(Number num);

    int convertToDecimal(string num,int binary);//将任意进制转化为十进制

    string decimalToAnyBinary(int decimal,int binary);//将十进制转化为任意进制

    Number ToAnyBinary(int binary);//将任意进制转化为任意进制

    void showNumber();//打印整数信息

};

程序代码:

 

  1. #include <iostream>  
  2. #include <string>  
  3. #include <cmath>  
  4. using namespace std;  
  5.   
  6. /*将一个整型数字转化成字符型数字,例如 8->'8',12->'c'*/  
  7. char numToChar(char num)  
  8. {  
  9.     /*num是0到9之间的数字*/  
  10.     if(num<=9&&num>=0)  
  11.     {  
  12.         num+=48;  
  13.     }  
  14.   
  15.     /*num是10到15之间的数字*/  
  16.     else  
  17.     {  
  18.         switch(num)  
  19.         {  
  20.         case 10:num='A';  
  21.         case 11:num='B';  
  22.         case 12:num='C';  
  23.         case 13:num='D';  
  24.         case 14:num='E';  
  25.         case 15:num='F';  
  26.         }  
  27.     }  
  28.     return num;  
  29. }  
  30.   
  31. /*将一个字符型数字转化成整型数字,例如 '8'->8,'c'->12*/  
  32. int charToNum(char &num)  
  33. {  
  34.     /*num是0到9之间的字符型数字*/  
  35.     if(num<='9'&&num>='0')  
  36.     {  
  37.         num-=48;  
  38.     }  
  39.   
  40.     /*num是'A'到'F'之间的字符型数字*/  
  41.     else  
  42.     {  
  43.         switch(num)  
  44.         {  
  45.         case 'A':  
  46.         case 'a':  
  47.             num=10;  
  48.         case 'B':  
  49.         case 'b':  
  50.             num=11;  
  51.         case 'C':  
  52.         case 'c':  
  53.             num=12;  
  54.         case 'D':  
  55.         case 'd':  
  56.             num=13;  
  57.         case 'E':  
  58.         case 'e':  
  59.             num=14;  
  60.         case 'F':  
  61.         case 'f':  
  62.             num=15;  
  63.         }  
  64.     }  
  65.     return num;  
  66. }  
  67.   
  68. /*将任意进制整数转化为十进制整数,返回转化后的十进制整数,num为任意进制整数,binary为该整数的进制*/  
  69. int anyBinaryToDecimal(string num,int binary)  
  70. {  
  71.     int len=num.size();  
  72.     int decimal_num=0;  
  73.     for(int i=0;i<len;i++)  
  74.     {  
  75.         decimal_num+=charToNum(num[i])*pow(binary,len-i-1);  
  76.     }  
  77.     return decimal_num;  
  78. }  
  79.   
  80. /*将十进制转化为任意进制,decimal为十进制整数,binary为需要转化的进制*/  
  81. void decimalToAnyBinary(int decimal,int binary)  
  82. {  
  83.     string result;//保存x进制数  
  84.     char temp;  
  85.     while(decimal>0)  
  86.     {  
  87.         temp=decimal%binary;  
  88.         result+=numToChar(temp);  
  89.         decimal=decimal/binary;  
  90.     }  
  91.       
  92.     /*输出转化后的x进制整数*/  
  93.     for(int i=result.size()-1;i>=0;i--)  
  94.         cout<<result[i];  
  95.     cout<<endl;  
  96. }  
  97.   
  98. int main()  
  99. {  
  100.     string num="1f";//十六进制数  
  101.     int decimal_num=anyBinaryToDecimal(num,16);//将十六进制数转化成十进制数  
  102.     cout<<decimal_num<<endl;//打印转化后的十进制数  
  103.     decimalToAnyBinary(decimal_num,8);//将十进制数转化成八进制数,并输出结果  
  104.     return 0;  
  105. }  
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


发布了661 篇原创文章 · 获赞 370 · 访问量 312万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览