【蓝蓝计算机考研算法】-day27-十六进制转化为十进制

216 阅读1分钟

41、十六进制转化为十进制

写一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围: 1<=n<= 2^31-1

输入描述

输入一个十六进制的数值字符串

输出描述

输出该数值的十进制字符串

示例:

输入:

0xAA

输出:

170

思路

  • 读取十六进制数,并将其转换成十进制存储,最后用 %x 输出该数的十进制表示即可
  • 十六进制转十进制:从高位开始,每位乘以16的n-1次方,再相加,即可得出十进制数。(n为十六进制数的位数)
  • 更多进制转化总结,可参考大神链接

具体实现

#include <iostream>
using namespace std;
int main() {
	string s; //存放十六进制数 
	int ans; //保存转换后的十进制数 
	while (cin >> s) {
		int ls = s.size();
		ans = 0;
		for (int i = 0; i < ls; i++) { //从第一个字符开始遍历(最右边的) 
			ans = ans * 16;
			if (s[i] >= '0' && s[i] <= '9')
				ans = ans + (s[i] - '0');
			else //从10开始往后就为字母A~F 
				ans = ans + (s[i] - 'A') + 10;
		}
		cout << ans << endl;
	}
	return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度O(n) --- 其中n为字符串长度
  • 空间复杂度O(1) --- 没有额外的辅助空间,常数级存储空间

其他实现方式

#include <stdio.h>
int main() {
	
	int ret ;
	scanf_s("%x", &ret);//%x是以十六进制形式输入
	printf("%d", ret);
	return 0;
}
//使用sscanf函数将以字符串形式的十六进制数转换为整形的十六进制
//sscanf与printf函数很像,都是以格式化的形式进行操作,、
//例如sscanf_s("A23CD", "%x", &a);
//%x是将字符串A23CD以十六进制形式输入a中,
//如果将%x换成%d的话,是将字符串A23CD以十进制形式输入a中,
//这是错误的,因为将A23CD转化为十进制,A,CD等字符无法解析,
#include <stdio.h>
int main()
{
    int a,B;
    sscanf_s("0xAA", "%x", &a);
    printf("%x\n", a);
    printf("%d\n", a);
    return 0;
}