第二题:进制转换
题目描述
N 进制数指的是逢 N 进一的计数制。例如,人们日常生活中大多使用十进制计 数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合 也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五;本题 中,十一进制到十五进制也是类似的)。 在本题中,我们将给出 N 个不同进制的数。你需要分别把它们转换成十进制数。
输入格式
输入的第一行为一个十进制表示的整数 N。接下来 N 行,每行一个整数 K,随 后是一个空格,紧接着是一个 K 进制数,表示需要转换的数。保证所有 K 进制 数均由数字和大写字母组成,且不以 0 开头。保证 K 进制数合法。 保证 N≤1000;保证 2≤K≤16。 保证所有 K 进制数的位数不超过 9。
输出格式
输出 N 行,每一个十进制数,表示对应 K 进制数的十进制数值。
样例:
输入
2
8 1362
16 3F0
输出
754
1008
输入
2
2 11011
10 123456789
输出
27
123456789
说明/提示:
对于任意一个 L 位 K 进制数,假设其最右边的数位为第 0 位,最左边的数位 为第 L−1 位,我们只需要将其第 i 位的数码乘以权值 Ki,再将每位的结果相加, 即可得到原 K 进制数对应的十进制数。
下面是两个例子:
八进制数 1362 对应的十进制数为:\(1×8^3+3×8^2+6×8^1+2×8^0=754\);
十六进制数 3F0 对应的十进制数为:\(3×16^2+1^5×16^1+0×16^0=1008\)。
视频题解
https://dl.ccf.org.cn/video/videoDetail.html?_ack=1&id=7291955414714368
AC题解
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int N;
cin >> N; // 输入 N,表示需要转换的进制数的数量
while (N--) {
int K; // 进制
string num; // 需要转换的 K 进制数
cin >> K >> num; // 输入进制数 K 和 K 进制表示的数字 num
int decimal_value = 0; // 用来存储转换后的十进制值
int length = num.length();
// 从左到右进行转换
for (int i = 0; i < length; i++) {
char digit = num[i]; // 获取当前字符
int value;
// 判断当前字符是数字还是字母
if (digit >= '0' && digit <= '9') {
value = digit - '0'; // 数字字符转换成对应的数值
} else if (digit >= 'A' && digit <= 'F') {
value = digit - 'A' + 10; // 字母字符转换成对应的数值
}
// 将当前位的值加到十进制结果中
decimal_value += value * pow(K, length - 1 - i);
}
cout << decimal_value << endl; // 输出转换后的十进制数
}
return 0;
}
代码说明:
- 首先读取整数 N,表示有多少个不同进制的数需要转换。
- 对于每个数,读取进制 K 和需要转换的数(以字符串的形式表示),然后逐位处理。
- 将每一位上的字符转换成对应的数值:
- 如果是数字字符
'0'
到'9'
,则转换为 0 到 9 的值。 - 如果是字母字符
'A'
到'F'
,则转换为 10 到 15 的值。
- 如果是数字字符
- 对于每一位,按其在数中的位置乘以对应的 K 的幂,累加得到十进制数。
- 最后输出转换后的十进制结果。
示例输入:
3
2 1011
8 77
16 1A
示例输出:
11
63
26
解释:
1011
(二进制) 转换为十进制是 11。77
(八进制) 转换为十进制是 63。1A
(十六进制) 转换为十进制是 26。