含十六进制的各进制转换

关于进制转换的一些基本逻辑和操作,我在令人头疼的进制转换一文已经详细介绍过了,在这就不再详细介绍了,本文主要介绍含十六进制的进制转换。

因为十六进制数字含有a、A、b、B等字符,所以无法使用%d进行读取数字,因此需要涉及到数组、字符串、自定义函数等的使用。

与十进制以内进制间的相互转换的逻辑相同,含十六进制的进制转换也是要先转化为十进制数,再转化为所要的进制数。

代码如下:

#include 
#include 
#include 
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是从最低位开始输出的,因此函数嵌套的步骤是不可省略的,否则输出的就是所求结果的逆序数。

编写程序的难点在于对自定义函数的使用和函数嵌套的使用,而且程序较长,在编写程序初期需要不断的试错、调试、修改才能达到要求,因此需要有极好的耐心才能一直坚持下去,最终使程序达到自己预期的效果。

编写不易,麻烦点个赞点个关注呗!

你可能感兴趣的:(c语言)