输入一个十六进制数,输出相应的十进制数

版权声明:转载请注明出处 https://blog.csdn.net/nanhuaibeian/article/details/87869720

1. 题目

输入一个十六进制数,输出相应的十进制数

2.知识点

  1. 十六进制转换有16进制每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F16个大小不同的数,即逢16进1,其中用A,B,C,D,E,F(字母使用大写)这六个字母来分别表示10,11,12,13,14,15。
  2. 输入的15进制数,是以字符串形式输入的,因此每一位都需要转换
  3. 16转10
    16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
    所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。
    例:2AF5换算成10进制:
    用竖式计算:
    第0位: 5 * 16^0 = 5
    第1位: F * 16^1 = 240
    第2位: A * 16^2= 2560
    第3位: 2 * 16^3 = 8192

3. 代码

#include <stdio.h>
#include <string.h>
#include <math.h>
#define max 100

int main() {
//flag 循环判断输入,result为转换后的10进制结果,len输入的字符串长度
	int result,i,j,len,temp,flag=1;
//数组a用来接收输入的字符串
	char a[max];
	printf("请输入16进制数:");
	gets(a);

	while(flag) {
	//每次输入的数据都要重新置result为0
		result =0;
		len = strlen(a);
		i = len-1;
		j=0;
		//i数组下标由低位到高位
		while(i>=0) {
		//由于输入的均为字符串,因此需要转换
			if(a[i]>='0'&&a[i]<='9') {
				temp = (a[i]-'0')*pow(16,j);
				result = result + temp;
			} else	if(a[i]>='a'&&a[i]<='f') {
				temp = (a[i]-'a'+10)*pow(16,j);
				result = result + temp;
			} else	if(a[i]>='A'&&a[i]<='F') {
				temp = (a[i]-'A'+10)*pow(16,j);
				result = result + temp;
			} else {
				printf("含有非法字符,请重新输入:");
				gets(a);

			}
			j++;
			i--;

		}
		printf("转换后的十进制数为:%d\n",result);
		printf("是否继续输入:(1 or 0):");
		scanf("%d",&flag);
		if(flag) {
			printf("请继续输入:");
				scanf("%s",a); 
		}
	}
	return 0;
}

4. 问题

if(flag) {
			printf("请继续输入:");
				scanf("%s",a); 
		}

flag判断之后的重新输入,不知道为啥不能使用gets()函数继续输入字符串a,需要使用scanf。

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/87869720