第二题:进制转换

题目描述

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;
}

代码说明:

  1. 首先读取整数 N,表示有多少个不同进制的数需要转换。
  2. 对于每个数,读取进制 K 和需要转换的数(以字符串的形式表示),然后逐位处理。
  3. 将每一位上的字符转换成对应的数值:
    • 如果是数字字符 '0''9',则转换为 0 到 9 的值。
    • 如果是字母字符 'A''F',则转换为 10 到 15 的值。
  4. 对于每一位,按其在数中的位置乘以对应的 K 的幂,累加得到十进制数。
  5. 最后输出转换后的十进制结果。

示例输入:

3
2 1011
8 77
16 1A

示例输出:

11
63
26

解释:

  • 1011 (二进制) 转换为十进制是 11。
  • 77 (八进制) 转换为十进制是 63。
  • 1A (十六进制) 转换为十进制是 26。