关于进制转换的一些基本逻辑和操作,我在令人头疼的进制转换一文已经详细介绍过了,在这就不再详细介绍了,本文主要介绍含十六进制的进制转换。
因为十六进制数字含有a、A、b、B等字符,所以无法使用%d进行读取数字,因此需要涉及到数组、字符串、自定义函数等的使用。
与十进制以内进制间的相互转换的逻辑相同,含十六进制的进制转换也是要先转化为十进制数,再转化为所要的进制数。
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int TenNum(char*p, int x); //将数组中输入的数字转换成10进制数
void Numchang1(int m, int y); //将转换好了的10进制数转换为所需进制数(从最高位开始打印)
void Numchang2(int m, int y); //将转换好了的10进制数转换为所需进制数(从最低位开始打印)
int TenNum(char*p, int x)//将输入的数转化为十进制
{
int len, i, num;
int sum = 0;
len = strlen(p); //求得字符串长度
for (i = 0; i < len; i++)
{
if (*(p + i) >= '0' && *(p + i) <= '9')
num = *(p + i) - '0';//*(p+i)-'0'利用ASCII码值差值求该位的值
else if (*(p + i) >= 'A' && *(p + i) <= 'F')
num = *(p + i) - 'A' + 10;//*(p+i)-'A'利用ASCII码值差值求该位的值
else
num = *(p + i) - 'a' + 10;//*(p+i)-'a'利用ASCII码值差值求该位的值
sum = sum * x + num;
}
return sum;
}
void Numchange1(int m, int y)//进制转换并输出(从最高位开始)
{
int n;
if (m)
{
Numchange1(m / y, y);//一直嵌套Numchange函数是为了让转化后的数字从最高位开始打印
n = m % y;
if (n < 10)
printf("%d", n);
else
{
if (n == 10)
printf("A");
if (n == 11)
printf("B");
if (n == 12)
printf("C");
if (n == 13)
printf("D");
if (n == 14)
printf("E");
if (n == 15)
printf("F");
}
}
}
void Numchange2(int m, int y)//进制转换并输出(从最低位开始)
{
int n;
//if (m)
while(m)
{
//Numchange1(m / y, y);//一直嵌套Numchange函数是为了让转化后的数字从最高位开始打印
n = m % y;
if (n < 10)
printf("%d", n);
else
{
if (n == 10)
printf("A");
if (n == 11)
printf("B");
if (n == 12)
printf("C");
if (n == 13)
printf("D");
if (n == 14)
printf("E");
if (n == 15)
printf("F");
}
m /= y;
}
}
int main()
{
int t=0, b=0;
char a[20] = {0};
printf("请输入待转换数的进制(2-16):");
do
{
scanf("%d", &t);
} while (t < 2 && t > 16);
printf("请输入待转换数:");
getchar();//吸收空格
gets(a);//将输入的n进制数存放在数组a中
int m = TenNum(a, t); //将输入的数字转换成十进制数
printf("请输入需要转成几进制数(2-16):");
do
{
scanf("%d", &b);
} while (t < 2 && t > 16);
printf("%d进制数%s转换为%d进制数的结果为:\n", t, a, b);
Numchange1(m, b); //将十进制数转换为所需进制数,从最高位开始打印在屏幕上
printf("\n");
Numchange2(m, b); //将十进制数转换为所需进制数,从最低位开始打印在屏幕上
printf("\n");
return 0;
}
运行实例:
其中输出的十六进制数F74是从最高位开始输出的,而47F是从最低位开始输出的,因此函数嵌套的步骤是不可省略的,否则输出的就是所求结果的逆序数。
编写程序的难点在于对自定义函数的使用和函数嵌套的使用,而且程序较长,在编写程序初期需要不断的试错、调试、修改才能达到要求,因此需要有极好的耐心才能一直坚持下去,最终使程序达到自己预期的效果。
编写不易,麻烦点个赞点个关注呗!