2025-03-25 学习记录--C/C++-PTA 习题7-8 字符串转换成十进制整数

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻

一、题目描述 ⭐️

习题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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呀小萝卜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值