题目:
描述:写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入描述:输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。
输出描述:输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例1
输入:
0xA
0xAA
复制输出:
10
170
结果:
方法一:(直接直接用输入输出格式化处理)
方法二:(按照题目要求用字符串处理)
解题思路:
方法一:(直接直接用输入输出格式化处理)
这个方法有点投机取巧。
既然是十六进制转换十进制。
那么scanf格式化输入的时候按照十六进制获取。
然后在printf格式化输出的时候按照十进制输出即可。
emm。。就是投机取巧,并不是按照题目处理字符串
方法二:(按照题目要求用字符串处理)
1,首先获取1个字符串。
2,从末尾开始获取数值。(注意循环获取的时候,前两个字符是0x所以不需要计算)
3,将每一个字母分为大写的A~F和小写a~f,以及0~9。从而先将当前位数的转换为十进制。
4,通过当前获取的位是字符串的 len - i位,计算出是十六进制的第len - i位。从而乘以16的len-i次方。
5,将获取的每个位的十进制相加。
代码:
方法一:(直接直接用输入输出格式化处理)
#include <stdio.h>
int main() {
int hex, dec;
while(scanf("%x", &hex) != EOF) {
printf("%d\n", hex);
}
return 0;
}
方法二:(按照题目要求用字符串处理)
#include <stdio.h>
#include <string.h>
int main() {
char hex[1024] = {};
while(scanf("%s", hex) != EOF) {
int len = strlen(hex);
int dec = 0;
//循环读取每一位
for(int i = len; i > 2; i--) {
char chr = hex[i-1];
int temp = 0;
//将每一位转换为十进制(只需区分a~z或者A~Z或者0~9即可
if(chr >= 'a') {
temp = chr - 'a' + 10;
}
else if(chr < 'A') {
temp = chr - '0';
}
else {
temp = chr - 'A' + 10;
}
//通过循环对当前位获得16的次方
for(int j = len - i; j > 0; j--) {
temp = temp * 16;
}
dec += temp;
}
printf("%d\n", dec);
memset(hex, '\n', 1024);
}
return 0;
}