合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
习题7-8 字符串转换成十进制整数
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式: ❀
输入在一行中给出一个以#结束的非空字符串。
输出格式: ❀
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例: ❀
+-P-xf4+-1!#
输出样例: ❀
-3905
二、代码(C语言)⭐️
#include <stdio.h> // 标准输入输出库(提供printf、getchar等函数)
#include <ctype.h> // 字符处理库(提供isxdigit、tolower等函数)
#include <math.h> // 数学函数库(提供pow函数)
int main() {
// 变量声明和初始化
int numArr[1000]; // 存储十六进制数字的数组(每位转换为十进制后存储)
int cnt = 0; // 计数器,记录有效十六进制数字的个数
int flag = 0; // 标记是否已遇到第一个有效数字(用于处理负号)
int sign = 1; // 符号标志:1表示正数,-1表示负数
long long res = 0; // 存储最终十进制结果(使用long long防止大数溢出)
char ch; // 存储当前读取的字符
// 输入处理循环:逐个读取字符直到遇到'#'结束符
while((ch = getchar()) != '#') {
// 处理负号(仅在第一个有效数字前出现才有效)
if(ch == '-' && flag == 0) {
sign = -1; // 设置负号标志
}
// 处理有效的十六进制字符(0-9, a-f, A-F)
else if(isxdigit(ch)) {
ch = tolower(ch); // 统一转为小写字母处理
// 转换为对应的数值:字母a-f转为10-15,数字字符转为0-9
numArr[cnt++] = (ch >= 'a') ? (ch - 'a' + 10) : (ch - '0');
flag = 1; // 标记已遇到有效数字(之后出现的'-'不再处理)
}
}
// 十六进制转十进制计算
for(int i = 0; i < cnt; i++) {
// 计算当前位的值:数字×16的幂次方(从高位到低位)
res += numArr[i] * pow(16, cnt - i - 1);
}
// 应用符号
res *= sign;
// 输出最终结果(使用%lld格式输出long long类型)
printf("%lld", res);
return 0; // 程序正常结束
}
三、知识点 ⭐️
1、C语言 while(ch = getchar(), ch != ‘#‘) 和 while(ch = getchar() && ch != ‘#‘) 的区别;
2、C 库函数 - isxdigit()、tolower()。