📘任意进制转换

2026-08-22
⭐⭐ GESP 5级

📖概念讲解

【考点 · 5级】 任意进制转换 — 数制变换类,常考 N 进制 ↔ 10进制 互转。


【说人话】 核心就两招:

⚡ 易错点:余数 ≥ 10 时要用字母表示(A=10, B=11, ... F=15),读入时也要把字母转回数字。十六进制字符串 "1A3F" 里 'A' 代表 10。

💻代码示例

1#include<iostream>
2#include<string>
3#include<algorithm>
4using namespace std;
5
6// 十进制 → 目标进制字符串
7string toBase(int n, int base) {
8 if (n == 0) return "0"; // 特判:0 的任意进制都是 "0"
9 string digits = "0123456789ABCDEF"; // 用下标取余数对应的字符
10 string result = "";
11 while (n > 0) {
12 result += digits[n % base]; // 取余得到当前最低位字符
13 n /= base; // 整除去掉最低位
14 }
15 reverse(result.begin(), result.end()); // 余数是反的,翻转
16 return result;
17}
18
19int main() {
20 int n = 255; // 待转换的十进制数
21 cout << n << " → 二进制: " << toBase(n, 2) << endl;
22 cout << n << " → 八进制: " << toBase(n, 8) << endl;
23 cout << n << " → 十六进制: " << toBase(n, 16) << endl;
24 return 0;
25}
26// 输出: 255 → 二进制: 11111111
27// 255 → 八进制: 377
28// 255 → 十六进制: FF

🧩互动小测

题目 1:十进制 13 转二进制是多少?

题目 2:十六进制 "1A" 转十进制等于?

题目 3:十进制 0 转任意进制,toBase 函数应该返回?

🏋️动手练一练

📝 编程练习

题目:输入一个十进制正整数 N 和目标进制 B(2 ≤ B ≤ 16),输出 N 在 B 进制下的表示。

输入样例:255 16
输出样例:FF

提示:使用「除 B 取余倒序」的方法。注意余数 ≥ 10 时要对应到大写字母 A-F。
参考答案:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int n, b;
    cin >> n >> b;               // 读入十进制数和目标进制
    if (n == 0) { cout << "0"; return 0; }
    string digits = "0123456789ABCDEF";
    string res = "";
    while (n > 0) {
        res += digits[n % b];     // 取余得到一位
        n /= b;                   // 除掉最低位
    }
    reverse(res.begin(), res.end()); // 余数倒序
    cout << res << endl;
    return 0;
}

要点:别忘了特判 n=0 的情况(直接输出 "0"),以及 reverse 翻转余数序列。

📝易错点提醒

学完这个知识点后点一下