题解 | #进制转换#
进制转换
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个符号包括:
- 数字
0到9表示值0到9。 - 字母
A到F表示值10到15。
十六进制与十进制的关系
在十进制中,每一位数字代表一个权重,从右到左依次是 (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 |
十六进制前缀
在编程和计算机科学中,十六进制数通常以特定的前缀表示,以便区分于十进制和其他进制的数字。常见的前缀包括:
- 二进制: 前缀
0b或0B - 八进制: 前缀
0o或0O(在某些语言中使用0作为前缀) - 十六进制: 前缀
0x或0X
十六进制前缀的作用
- 明确标识:前缀明确地告诉编译器或解释器,后面的数字是十六进制格式,而不是默认的十进制或其他进制。
- 避免歧义:例如,数字 10 在十进制中表示值 10,但在十六进制中表示值 16。前缀 0x 可以消除这种歧义。
- 标准化:使用统一的前缀有助于代码的一致性和可读性。
十六进制前缀的具体含义
- 0x:小写的 x 表示十六进制。
- 0X:大写的 X 也表示十六进制。
示例
| 10 |
| 10 |
| 16 |
| 16 |
为什么需要处理前缀?
在你的代码中,输入的十六进制字符串可能以 0x 或 0X 开头。如果不处理这些前缀,直接从第一个字符开始转换会导致错误的结果。例如:
- 输入
0xAA,如果不跳过0x,则会尝试将0和A转换为十进制,导致错误的结果。
处理前缀的方法
为了正确处理输入的十六进制字符串,可以在转换之前检查并跳过前缀 0x 或 0X。

