BASIC-11 十六进制转十进制 C语言版

博客介绍了一种使用C语言将不超过8位的正十六进制数字符串转换为十进制数的方法。通过字符数组存储十六进制字符串,整形数组存储十进制数位,再通过展开函数计算十进制表示。文章提供了输入处理、数位转换、数位展开和结果输出的思路,并给出部分代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535

1.这道题的一个通用思路,首先获得数的十六进制表示,然后分别将每个数位表示为十进制,数位展开求和,并输出。

(1)考虑输入,可以用一个字符数组存储输入的十六进制字符串,char a[8];

(2)考虑数位转化,可以用一个整形数组存储转换为十进制表示的数位,int b[8];

(3)考虑数位展开,可以定义一个展开函数,主函数中只需要将数位与展开函数的结果相乘,定义一个long num,累加。

(4)将结果输出。

如果只考虑出题范围,许多问题可以不进行讨论。

#include<stdio.h>
int main()
{
	char a[8];  //存储十六进制字符
	int b[8];  	//存储各个数位的十进制表示
	int i,j=0;
	long num=0;//存储求和结果
	for(i=0;i<8;i++)  //最多输入8位
	{
		scanf("%c",&a[i]);
		if((a[i]=='\n')||(a[i]=='\0'))  //如果输入字符是空格或者回车,结果输入
		{
			break;
		}
	}
	printf("%c\n",a[j]);   //测试输入
	printf("%d\n",i);    	//测试
	for(j=0;j<i;j++)		//数位展开,并赋给int b
	{
		if((a[j]<='9')&&(a[j]>='0'))
		{
			b[j]=a[j];
		}
			switch(a[j])
			{
				case 'A':
					b[j]=10;
					break;
				case 'B':
					b[j]=11;
					break;
				case 'C':
					b[j]=12;
					break;
				case 'D':
					b[j]=13;
					break;
				case 'E':
					b[j]=14;
					break;
				case 'F':
					b[j]=15;
					break;
				default:
					break;
			}
	
	}
	for(j=0;j<i;j++)   //测试
	{
		if(b[j]<=15&&b[j]>=0)  //本题中可以省略,过滤错误输入
		{
			printf("%d\n",b[j]);
		}
	}
	return 0;
}

上面,我们将十六进制代码输入,并将各个数位转换为十进制,并做了一些数据测试。
下面我们来定义一个数位展开函数。

int getNum(int i)
{
	int j=0,num1=1;
	while(i-j>0)
	{
		num1*=16;
		j++;
	}
	return num1;
}

我们将数组a[j]中每个元素的索引相关量传入getNum函数,如果i=3,索引为0的数位需要乘16的立方,定义一个m,m=i-j,将m传入getNum函数。
那么,num=num+b[j]*getNum(m)
完整代码如下:

	#include<stdio.h>
	long long getNum(int i)
	{
		long long num1=1;
		while(i>0)
		{
			num1*=16;
			i--;
		}
		return num1;
	}
	int main()
	{
		char a[9];
		long b[8];
		int i,j=0;
		long long num=0;
		for(i=0;i<8;i++)
		{
			scanf("%c",&a[i]);
			if((a[i]=='\n')||(a[i]=='\0'))
			{
				break;
			}
		}
		for(j=0;j<i;j++)
		{
			if((a[j]<='9')&&(a[j]>='0'))
			{
				switch(a[j])
				{
					case '0':
						b[j]=0;
						break;
					case '1':
						b[j]=1;
						break;
				
			case '2':
				b[j]=2;
				break;
			case '3':
				b[j]=3;
				break;
			case '4':
				b[j]=4;
				break;
			case '5':
				b[j]=5;
				break;
			case '6':
				b[j]=6;
				break;
			case '7':
				b[j]=7;
				break;
			case '8':
				b[j]=8;
				break;
			case '9':
				b[j]=9;
				default:
					break;
		}
	}
		switch(a[j])
		{
			case 'A':
				b[j]=10;
				break;
			case 'B':
				b[j]=11;
				break;
			case 'C':
				b[j]=12;
				break;
			case 'D':
				b[j]=13;
				break;
			case 'E':
				b[j]=14;
				break;
			case 'F':
				b[j]=15;
				break;
			default:
				break;
		}
}
if(i==1)
{
	num=b[0];
}
if(i>1)
{
	for(j=0;j<i;j++)
	{
		num+=b[j]*(getNum(i-j-1));
	}
}
printf("%I64d",num);
return 0;

}

这里有一个需要注意的点,简略代码如上所示,朋友们可以进行完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值