洛谷B3849 [GESP样题 三级] 进制转换
题目链接:https://www.luogu.com.cn/problem/B3849
[GESP样题 三级] 进制转换
题目描述
小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用 A
表示 10、F
表示 15。如果扩展到用 Z
表示 35,岂不是可以表示 36 进制数了嘛!
所以,你需要帮助她写一个程序,完成十进制转 R 进制(2<=R<=36)的工作。
输入格式
输入两行,第一行包含一个正整数 N,第二行包含一个正整数 R,保证 1<=N<=10^6。
输出格式
输出一行,为 N 的 R 进制表示。
样例 #1
样例输入 #1
123
25
样例输出 #1
4N
思路:
为了将十进制数转换为任意给定的 R 进制(2≤R≤36),我们可以使用除 R 取余的方法来逐位计算 R 进制的每一位。注意,当 R 大于 10 时,我们需要使用字符 'A' 到 'Z' 来表示 10 到 35
AC代码如下:
#include <iostream>
#include <string>
using namespace std;
// 函数:将十进制数转换为R进制字符串
string decToBaseR(int N, int R) {
string result = "";
// 处理特殊情况:当N为0时,直接返回"0"
if (N == 0) return "0";
// 逐位计算R进制表示
while (N > 0) {
int remainder = N % R; // 计算余数
if (remainder < 10) {
result = char(remainder + '0') + result; // 余数小于10,直接转换为字符
}
else {
result = char(remainder - 10 + 'A') + result; // 余数大于等于10,转换为'A'-'Z'
}
N /= R; // 更新N为商
}
return result;
}
int main() {
int N, R;
cin >> N >> R; // 读取十进制数和进制数
// 调用函数并输出结果
cout << decToBaseR(N, R) << endl;
return 0;
}