Fork me on GitHub

C++实现任意进制之间转换

实现思路

实现任意进制之间转换,这里的思路是先将这个数转换成十进制,再由十进制转换成其它进制。
实现任意进制到十进制的转换,采用的方法是:按位权展开相加。
例如,把二进制数1011按权展开:

而将十进制转换成其它进制采用的方法是:乘基取整法。
举个例子,将十进制数7转换成二进制数,我们需要把7不断除以2,得到商和余数,将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。
具体过程:
$7÷2=3$余1
$3÷2=1$余1
$1÷2=0$ (0.5这里取0,余数就取被除数1)

将所有余数倒序排列,即为111

实现方法

首先,我们需要储存输入的数,这里需要注意的是,进制数大于10的数可能存在字母,例如:
十六进制是由 0~F 这一组固定的数字来表示,因此我们应该釆用字符数组进行储存输入的数。
然后在程序中我们用两个自定义函数char_to_numbernumber_to_char来实现一个字符与其对应数值之间的转换。

1
2
3
4
5
6
7
8
9
10
11
12
int char_to_num(char ch){
if(ch>='0'&&ch<='9')
return ch-'0';
else
return ch-'A'+10;
}
char num_to_char(int num){
if(num>=0&&num<=9)
return (char)('0'+num-0);
else
return (char)('A'+num-10);
}

任意进制到十进制的转换的实现如下,source为原数进制:

1
2
3
4
5
6
7
long long source_to_decimal(char* temp, int source){
long long decimal_num=0;
int length=strlen(temp);
for(int i=0; i<=length-1; i++ )
decimal_num = (decimal_num*source) + char_to_num(temp[i]);
return decimal_num;
}

然后是十进制到任意进制(这个函数是返回得到结果的长度,因此用int就够了),object为转换后的进制:

1
2
3
4
5
6
7
8
9
int decimal_to_object(char* temp, long long decimal_num, int object){
int i=0;
while(decimal_num){
temp[i] = num_to_char(decimal_num % object);
decimal_num = decimal_num / object;
i++;
}
return i;
}

完整程序代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<bits/stdc++.h>
const int Maxn=1001;//最大数组长度
int char_to_num(char ch){
if(ch>='0'&&ch<='9')
return ch-'0';
else
return ch-'A'+10;
}
char num_to_char(int num){
if(num>=0&&num<=9)
return (char)('0'+num-0);
else
return (char)('A'+num-10);
}
long long source_to_decimal(char* temp, int source){
long long decimal_num = 0;
int length=strlen(temp);
for(int i=0; i<=length-1; i++ )
decimal_num = (decimal_num*source) + char_to_num(temp[i]);
return decimal_num;
}
int decimal_to_object(char* temp, long long decimal_num, int object){
int i=0;
while(decimal_num){
temp[i] = num_to_char(decimal_num % object);
decimal_num = decimal_num / object;
i++;
}
return i;
}
int main(){
int source,object;
long long decimal_num;
char temp[Maxn];//字符数组储存
printf("原数:");
scanf("%s", temp);
printf("原数的进制:");
scanf("%d", &source);
printf("目标数制:");
scanf("%d", &object);
printf("转换后的数:");
decimal_num = source_to_decimal(temp, source);//转十进制
int length = decimal_to_object(temp, decimal_num, object);//转目标进制,并获取余数的数量
for(int i=length-1; i>=0; i--)
printf("%c", temp[i]);//逆序输出
return 0;
}

这个程序实现了输入原数、其进制和目标进制,输出转换结果。
测试结果如下,与上述结果一致:

1
2
3
4
原数:7
原数的进制:10
目标数制:2
转换后的数:111

值得注意的是,这只是实现了整数的进制转换,如果有负数或小数转换过程会更加复杂。
具体过程可以自行查阅资料。