您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-02 22:40 806 查看
任意进制整数之间的相互转换经常出现在各大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();//打印整数信息

};

程序代码:

[cpp]
view plaincopy

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

/*将一个整型数字转化成字符型数字,例如 8->'8',12->'c'*/
char numToChar(char num)
{
/*num是0到9之间的数字*/
if(num<=9&&num>=0)
{
num+=48;
}

/*num是10到15之间的数字*/
else
{
switch(num)
{
case 10:num='A';
case 11:num='B';
case 12:num='C';
case 13:num='D';
case 14:num='E';
case 15:num='F';
}
}
return num;
}

/*将一个字符型数字转化成整型数字,例如 '8'->8,'c'->12*/
int charToNum(char &num)
{
/*num是0到9之间的字符型数字*/
if(num<='9'&&num>='0')
{
num-=48;
}

/*num是'A'到'F'之间的字符型数字*/
else
{
switch(num)
{
case 'A':
case 'a':
num=10;
case 'B':
case 'b':
num=11;
case 'C':
case 'c':
num=12;
case 'D':
case 'd':
num=13;
case 'E':
case 'e':
num=14;
case 'F':
case 'f':
num=15;
}
}
return num;
}

/*将任意进制整数转化为十进制整数,返回转化后的十进制整数,num为任意进制整数,binary为该整数的进制*/
int anyBinaryToDecimal(string num,int binary)
{
int len=num.size();
int decimal_num=0;
for(int i=0;i<len;i++)
{
decimal_num+=charToNum(num[i])*pow(binary,len-i-1);
}
return decimal_num;
}

/*将十进制转化为任意进制,decimal为十进制整数,binary为需要转化的进制*/
void decimalToAnyBinary(int decimal,int binary)
{
string result;//保存x进制数
char temp;
while(decimal>0)
{
temp=decimal%binary;
result+=numToChar(temp);
decimal=decimal/binary;
}

/*输出转化后的x进制整数*/
for(int i=result.size()-1;i>=0;i--)
cout<<result[i];
cout<<endl;
}

int main()
{
string num="1f";//十六进制数
int decimal_num=anyBinaryToDecimal(num,16);//将十六进制数转化成十进制数
cout<<decimal_num<<endl;//打印转化后的十进制数
decimalToAnyBinary(decimal_num,8);//将十进制数转化成八进制数,并输出结果
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: