一、前言
我们平时计算都是使用十进制数,但是有时候我们需要用到二进制数、十六进制数等。在进制转换中,我们主要需要掌握的是十进制转换成N进制和N进制转换成十进制,而对于任意进制之间的相互转换,例如:P进制转换成R进制。
1、将P进制转换成对应的十进制M;
2、将十进制M转换成R进制。
二、进制转换
2.1 进制的基本结构
提到不同进制的数,就必然要涉及到数的存储,十进制以下的进制数,可以像十进制一样,只是表示数所用的数字受限,如八进制数,只能用数字0~7来表示。而十进制以上的进制数,需要用数字和字母来表示单个位上的数,所以应以字符串方式存储。一般非十进制数采用字符数组的方式存储,数组的一个元素保存数的一位数字。
2.2 P进制转十进制
一般一个K进制的数可以按如下方式表示成十进制数:
其中:
所以K进制转成十进制,一般采用按位计算后求和即可。
2.3 十进制转R进制
十进制转R进制,一般也是辗除法,保存每次辗除法的余数,最后将这些余数的顺序颠倒即可。
三、进制转换核心
1、P进制转十进制
按位求和,总和
2、十进制转R进制
辗除法,保存每次余数
颠倒这些余数的顺序
四、代码实现
// 完全翻转字符串
void ReverString(string &s)
{
int i = 0;
int j = s.size()-1;
int temp;
for (; i<j; i++,j--)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
void PtoR(string &src, string &dest, int srcBase, int destBase)
{
int sum = 0;
int residue = 0;
string saveResidue;
// PtoD 转10进制
for (int i=0; src[i]!=' '; i++)
{
sum *= srcBase;
if (src[i]>='0'&&src[i]<='9')
{
sum += src[i]-'0' +0; // 字符转数字,可以先减掉基底字符,然后加上基底数字
}
else
sum += src[i]-'A' +10;
}
// DtoR 10进制转R
while (sum!=0)
{
residue = sum%destBase;
if (residue>=0&&residue<=9)
{
saveResidue += residue-0 +'0'; // 数字转字符,可以先减掉基底数字,然后加上基底字符
}
else
saveResidue += residue-10 + 'A';
sum = sum/destBase;
}
ReverString(saveResidue);
dest = saveResidue;
}
int main()
{
string s1 = "C";
string s;
PtoR(s1,s,16,18);
cout << s << endl;
return 0;
}