实现思路
实现任意进制之间转换,这里的思路是先将这个数转换成十进制,再由十进制转换成其它进制。
实现任意进制到十进制的转换,采用的方法是:按位权展开相加。
例如,把二进制数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_number
和number_to_char
来实现一个字符与其对应数值之间的转换。
1 | int char_to_num(char ch){ |
任意进制到十进制的转换的实现如下,source为原数进制:
1 | long long source_to_decimal(char* temp, int source){ |
然后是十进制到任意进制(这个函数是返回得到结果的长度,因此用int就够了),object为转换后的进制:
1 | int decimal_to_object(char* temp, long long decimal_num, int object){ |
完整程序代码如下:
1 |
|
这个程序实现了输入原数、其进制和目标进制,输出转换结果。
测试结果如下,与上述结果一致:
1 | 原数:7 |
值得注意的是,这只是实现了整数的进制转换,如果有负数或小数转换过程会更加复杂。
具体过程可以自行查阅资料。