综述由AI生成C++ 进制转换的 18 道经典算法题,涵盖十进制与二进制、八进制、十六进制之间的相互转换,以及任意进制的转换方法。内容包括除余法、权值展开法、分组转换法等核心技巧,并提供了完整的 C++ 代码实现示例。适合初学者巩固进制转换基础及提升算法思维能力。
古灵精怪24 浏览
C++ 进制转换经典算法题解析
第一关:十进制 ↔ 二进制(基础)
🧩 题 1 数字翻译机
题目描述
计算机王国有一台机器,它只会说 二进制语言。输入一个十进制数字,让机器翻译成二进制。
输入
13
输出
1101
解题思路
使用 除 2 取余法。
13 ÷ 2 = 6 余 1
6 ÷ 2 = 3 余 0
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
倒序排列得到 1101
参考代码
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
int a[100], k = 0;
while (n > 0) {
a[k++] = n % 2;
n /= 2;
}
for (int i = k - 1; i >= 0; i--) {
cout << a[i];
}
return0;
}
🧩 题 2 机器人读数字
题目描述
机器人只认识 二进制。但你给了它一个二进制数字,让它算出十进制是多少。
输入
10101
输出
21
解题思路
使用 权值展开法。
1×2⁴ + 0×2³ + 1×2² + 0×2¹ + 1×2⁰
16 + 4 + 1 = 21
参考代码
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++) {
ans = ans * 2 + (s[i] - '0');
}
cout << ans;
return0;
}
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
// 补 0 到 3 的倍数while (s.size() % 3 != 0) s = "0" + s;
for (int i = 0; i < s.size(); i += 3) {
int x = 0;
x = (s[i] - '0') * 4 + (s[i + 1] - '0') * 2 + (s[i + 2] - '0');
cout << x;
}
return0;
}
🧩 题 4 八进制翻译官
题目描述
输入一个八进制数字,翻译成十进制。
输入
157
输出
111
解题思路
使用 权值展开法。
1×8² + 5×8¹ + 7×8⁰
64 + 40 + 7 = 111
参考代码
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++) {
ans = ans * 8 + (s[i] - '0');
}
cout << ans;
return0;
}
第三关:二进制 ↔ 十六进制
🧩 题 5 十六进制魔法石
题目描述
魔法师使用 十六进制符号:A=10, B=11, C=12, D=13, E=14, F=15。
输入
FF
输出
255
解题思路
F = 15
15×16¹ + 15×16⁰
240 + 15 = 255
参考代码
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++) {
int x;
if (s[i] >= '0' && s[i] <= '9') x = s[i] - '0';
else x = s[i] - 'A' + 10;
ans = ans * 16 + x;
}
cout << ans;
return0;
}
🧩 题 6 二进制变十六进制
输入
11010110
输出
D6
解题思路
4 位一组。
1101 0110
D 6
参考代码
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
while (s.size() % 4 != 0) s = "0" + s;
for (int i = 0; i < s.size(); i += 4) {
int x = 0;
x = (s[i] - '0') * 8 + (s[i + 1] - '0') * 4 + (s[i + 2] - '0') * 2 + (s[i + 3] - '0');
if (x >= 0 && x < 10) cout << char('0' + x);
else cout << char('A' + x - 10);
}
return0;
}
第四关:任意进制转换
🧩 题 7 十进制 → 八进制
输入
100
输出
144
参考代码
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
int a[100], k = 0;
while (n > 0) {
a[k++] = n % 8;
n /= 8;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
🧩 题 8 十进制 → 十六进制
输入
255
输出
FF
参考代码
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
char a[100];
int k = 0;
while (n > 0) {
int r = n % 16;
if (r < 10) a[k++] = r + '0';
else a[k++] = r - 10 + 'A';
n /= 16;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
第五关:综合题
🧩 题 9 任意进制 → 十进制
输入
base = 7 number = 123
输出
66
解题思路
权值展开:1×7² + 2×7¹ + 3×7⁰
参考代码
#include<iostream>#include<string>usingnamespace std;
intmain(){
int base;
cin >> base;
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++) {
int x;
if (s[i] >= '0' && s[i] <= '9') x = s[i] - '0';
else x = s[i] - 'A' + 10;
ans = ans * base + x;
}
cout << ans;
return0;
}
🧩 题 10 十进制 → 任意进制
输入
n=100 base=3
输出
10201
万能模板
#include<iostream>usingnamespace std;
intmain(){
int n, base;
cin >> n >> base;
int a[100], k = 0;
while (n > 0) {
a[k++] = n % base;
n /= base;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
int n = 0;
for (int i = 0; i < s.size(); i++) n = n * 2 + (s[i] - '0');
int a[100], k = 0;
while (n > 0) {
a[k++] = n % 8;
n /= 8;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
🎯 第 12 题 八进制变成二进制
题目描述
程序员魔法师喜欢用八进制写数字,但是计算机只能看懂 二进制。
参考代码
通过十进制转换:八进制 → 十进制 → 二进制
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
int n = 0;
for (int i = 0; i < s.size(); i++) n = n * 8 + (s[i] - '0');
int a[100], k = 0;
while (n > 0) {
a[k++] = n % 2;
n /= 2;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
🎯 第 13 题 十六进制变二进制
题目描述
在 黑客学校,学生们用一种神秘语言。老师说:每一位十六进制都能变成 4 位二进制。
参考代码
通过十进制转换:十六进制 → 十进制 → 二进制
#include<iostream>#include<string>usingnamespace std;
intmain(){
string s;
cin >> s;
int n = 0;
for (int i = 0; i < s.size(); i++) {
int x;
if (s[i] >= '0' && s[i] <= '9') x = s[i] - '0';
else x = s[i] - 'A' + 10;
n = n * 16 + x;
}
int a[100], k = 0;
while (n > 0) {
a[k++] = n % 2;
n /= 2;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
🎯 第 14 题 二进制变十六进制
题目描述
计算机给你一个 超长二进制密码,国王要求把它翻译成 十六进制密钥。
参考代码
#include<iostream>usingnamespace std;
intmain(){
string s;
cin >> s;
int n = 0;
for (int i = 0; i < s.size(); i++) n = n * 2 + (s[i] - '0');
char a[100];
int k = 0;
while (n > 0) {
int r = n % 16;
if (r < 10) a[k++] = r + '0';
else a[k++] = r - 10 + 'A';
n /= 16;
}
for (int i = k - 1; i >= 0; i--) cout << a[i];
return0;
}
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
int cnt = 0;
while (n > 0) {
if (n % 2 == 1) cnt++;
n /= 2;
}
cout << cnt;
return0;
}
🎯 第 16 题 求二进制长度
题目描述
计算机想知道:一个数字需要多少 二进制位 才能表示?例如 13。
参考代码
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
int len = 0;
while (n > 0) {
n /= 2;
len++;
}
cout << len;
return0;
}
🎯 第 17 题 输出 8 位二进制
题目描述
计算机存储数字时,常用 8 位二进制。例如 5 必须写成 00000101。
参考代码
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
int a[8] = {0};
for (int i = 7; i >= 0; i--) {
a[i] = n % 2;
n /= 2;
}
for (int i = 0; i < 8; i++) cout << a[i];
return0;
}