[保研/考研机试] KY56 数制转换 北京大学复试上机题 C++实现

题目链接:

数制转换https://www.nowcoder.com/share/jump/437195121691734210665

描述

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。 不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入描述:

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。 数据可能存在包含前导零的情况。

输出描述:

可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

示例1

输入:

15 Aab3 7

输出:

210306

思路:

  1. 读入原进制 a、数字字符串 s 和目标进制 b。

  2. 将数字字符串按权展开转换为十进制数值 num,num 初始值为 0。

  3. 将十进制数值 num 按目标进制 b 转换为字符,将字符添加到结果字符串 res 中。

  4. 反转结果字符串 res 得到正确的转换结果。

  5. 输出转换后的结果。

源代码:

#include 
#include 
#include 
#include 
using namespace std;

// 将字符 c 转换为对应的十进制数值
int CharToInt(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';  // '0' 的 ASCII 值为 48,减去 '0' 后得到数值
    }
    else if (c >= 'a' && c <= 'f') {
        return c - 'a' + 10;  // 'a' 的 ASCII 值为 97,减去 'a' 后加上 10 得到数值
    }
    else{
        return c - 'A' + 10;  // 'A' 的 ASCII 值为 65,减去 'A' 后加上 10 得到数值
    }
}

// 将整数 n 转换为对应的字符
char IntToChar(int n) {
    if (n >= 0 && n <= 9) {
        return n + '0';  // 数值加上 '0' 的 ASCII 值即为对应字符
    }
    else {
        return n - 10 + 'A';  // 数值减去 10 后加上 'A' 的 ASCII 值即为对应字符
    }
}

int main()
{
    int a, b; // a:原进制,b:目标进制
    string s; // 输入的数字字符串
    while (cin >> a >> s >> b) {
        long num = 0; // 初始化十进制数值
        for (int i = s.size() - 1; i >= 0; i--) {
            num += CharToInt(s[i]) * pow(a, s.size() - 1 - i); // 将输入的数字字符串按权展开转换为十进制数值
        }
        
        string res = ""; // 初始化目标进制的结果字符串
        while (num != 0) {
            res += IntToChar(num % b); // 将十进制数值按目标进制转换为字符并添加到结果字符串中
            num /= b; // 取商继续处理
        }
        
        reverse(res.begin(), res.end()); // 反转结果字符串得到正确的转换结果
        cout << res << endl; // 输出结果
    }

    return 0;
}

提交结果:

[保研/考研机试] KY56 数制转换 北京大学复试上机题 C++实现_第1张图片

你可能感兴趣的:(机试刷题记录,c++,算法,数据结构,研究生复试,考研机试)