数制只是人用来计数的不同方法,但他们所表示的量不会改变。下面我们试着用C语言来实现数制之间的转换。
一.由十进制转换为其他进制
我们常用的更为熟悉的是十进制,那我们就用十进制开始。(下面用二进制举例)
如下图原理:除基取余,反向输出。
所以我们要做的是
1.记录余数。
2.将商转换为下一个被除数。
3.循环继续——递归
4.待商为零时停止循环(但同样记录余数)。
5.反向输出所记录的余数。
在处理倒序时,递归比循环更为简单。
根据如上思路写出一下通解过程:
void zhuanhuan(int i, int d) {
int yushu = i % d;
i = i / d;
if (i != 0) {
zhuanhuan(i, d);
}
printf("%d", yushu);
return;
}
(用一张图描述一下递归过程)
二,其他进制转换为十进制
解决了十进制对其他进制的转换,那其他的转换为十进制就简单的多。
如,二进制转换为十进制:
#include <stdio.h>
#include<string.h>
int main()
{
char two[] = "11010";
int ten=0;
int j = 1;
int len = strlen(two);
for (int i = 0;i < len;i++) {
int a = two[len-1-i] - '0';
ten = ten + a * j;
j = j * 2;
}
printf("%d", ten);
}
输出结果:
十六进制转换为十进制:
#include <stdio.h>
#include<string.h>
int main()
{
char S[] = "0123456789ABCDEF";
char sixteen[] = "9FA8C";
int ten=0;
int j = 1;
int len = strlen(sixteen);
for (int i = 0;i < len;i++) {
int a;
if (sixteen[len - 1 - i] >= '0' && sixteen[len - 1 - i] <= '9') {
a = sixteen[len - 1 - i] - '0';
}
else {
for (int j = 0;j < 16;j++) {
if (sixteen[len - 1 - i] == S[j]) {
a = j;
}
}
}
ten = ten + a * j;
j = j * 16;
}
printf("%d", ten);
}
输出结果:
三,各进制相互转换
当我们已经学会十进制与其他进制之间的转换,就可以将十进制做为中间过渡。如将二进制转换为十六进制,我们也就可以先将二进制转换为十进制,再见十进制转换为十六进制。
四,利用itoa()函数进行各数制转换
#include <stdio.h>
#include<stdlib.h>
int main()
{
int number1 = 123456;
int number2 = -123456;
char string[16] = {
0 };
itoa(number1, string, 10);
printf("数字:%d 转换后的字符串为:%s\n", number1, string);
itoa(number1, string, 8);
printf("数字:%d 转换后的字符串为:%s\n", number1, string);
itoa(number2, string, 10);
printf("数字:%d 转换后的字符串为:%s\n", number2, string);
itoa(number2, string, 16);
printf("数字:%d 转换后的字符串为:%s\n", number2, string);
return 0;
}