题解 | #进制转换#

进制转换

https://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6

#include <iostream>
#include <string>
#include <cctype> // 包含 isdigit 的头文件

int main() {
    std::string s;
    while (std::getline(std::cin, s)) {
        if (s.empty()) continue; // 忽略空字符串

        int start = 0;
        if (s.length() >= 2 && (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))) {
            start = 2; // 跳过 "0x" 或 "0X"
        }

        int ans = 0;
        for (int i = start; i < s.length(); ++i) {
            if (std::isdigit(s[i])) { //使用 isdigit(s[i]) 判断字符是否为数字('0'-'9')
                ans = ans * 16 + s[i] - '0'; //[1]
            } else if (std::isalpha(s[i])) { //使用 std::isalpha(s[i]) 判断字符是否为字母('A'-'F' 或 'a'-'f')。其实这里直接用else就可以了
                char upperChar = std::toupper(s[i]); //将字母转换为大写形式,然后计算对应的整数值并累加到 ans 中。这里我之前没考虑到
                ans = ans * 16 + 10 + upperChar - 'A'; //[1]
            }
        }
        std::cout << ans << std::endl;
    }
    return 0;
}

[1] s[i] - 'A': 计算字符 'A' 相对于 'A' 的偏移量。例如,'A' - 'A' 结果是 0'B' - 'A' 结果是 1,依此类推。

如果当前 ans 是 10(即十六进制的 A),并且我们遇到了字符 'B'ans * 16 得到 160

  • 10 + 'B' - 'A' 得到 11
  • 最终 ans 更新为 160 + 11 = 171,表示十六进制的 AB 对应十进制的 171
  • 更简单直接的方法:

    #include <iostream>
    #include <string>
    
    int main() {
        std::string hexString;
        
        while (std::getline(std::cin, hexString)) {
            // 使用 std::stoi 将十六进制字符串转换为十进制整数
            int decimalValue = std::stoi(hexString, nullptr, 16);
            
            // 输出十进制值
            std::cout << decimalValue << std::endl;
        }
    
        return 0;
    }
    

    十六进制概述

    十六进制是一种基于16的数值系统,使用16个不同的符号来表示数值。这16个符号包括:

    • 数字 09 表示值 09
    • 字母 AF 表示值 1015

    十六进制与十进制的关系

    在十进制中,每一位数字代表一个权重,从右到左依次是 (10^0)、(10^1)、(10^2) 等。例如:

    345 = 3 * 10^2 + 4 * 10^1 + 5 * 10^0
        = 3 * 100 + 4 * 10 + 5 * 1
        = 300 + 40 + 5
        = 345
    
    

    在十六进制中,每一位数字也代表一个权重,但权重是从右到左依次是 (16^0)、(16^1)、(16^2) 等。例如:

    1A3 = 1 * 16^2 + A * 16^1 + 3 * 16^0
        = 1 * 256 + 10 * 16 + 3 * 1
        = 256 + 160 + 3
        = 419
    
    

    十六进制字符的映射

    0

    0

    1

    1

    2

    2

    3

    3

    4

    4

    5

    5

    6

    6

    7

    7

    8

    8

    9

    9

    A

    10

    B

    11

    C

    12

    D

    13

    E

    14

    F

    15

    十六进制前缀

    在编程和计算机科学中,十六进制数通常以特定的前缀表示,以便区分于十进制和其他进制的数字。常见的前缀包括:

    • 二进制: 前缀 0b0B
    • 八进制: 前缀 0o0O(在某些语言中使用 0 作为前缀)
    • 十六进制: 前缀 0x0X

    十六进制前缀的作用

    1. 明确标识:前缀明确地告诉编译器或解释器,后面的数字是十六进制格式,而不是默认的十进制或其他进制。
    2. 避免歧义:例如,数字 10 在十进制中表示值 10,但在十六进制中表示值 16。前缀 0x 可以消除这种歧义。
    3. 标准化:使用统一的前缀有助于代码的一致性和可读性。

    十六进制前缀的具体含义

    • 0x:小写的 x 表示十六进制。
    • 0X:大写的 X 也表示十六进制。

    示例

    0xA

    10

    0XA

    10

    0x10

    16

    0X10

    16

    为什么需要处理前缀?

    在你的代码中,输入的十六进制字符串可能以 0x0X 开头。如果不处理这些前缀,直接从第一个字符开始转换会导致错误的结果。例如:

    • 输入 0xAA,如果不跳过 0x,则会尝试将 0A 转换为十进制,导致错误的结果。

    处理前缀的方法

    为了正确处理输入的十六进制字符串,可以在转换之前检查并跳过前缀 0x0X

    全部评论

    相关推荐

    03-01 19:30
    已编辑
    南京大学 Java
    点赞 评论 收藏
    分享
    评论
    点赞
    收藏
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务