C++ 进制转换经典算法题解析
C++ 进制转换的 18 道经典算法题,涵盖十进制与二进制、八进制、十六进制之间的相互转换,以及任意进制的转换方法。内容包括除余法、权值展开法、分组转换法等核心技巧,并提供了完整的 C++ 代码实现示例。适合初学者巩固进制转换基础及提升算法思维能力。

C++ 进制转换的 18 道经典算法题,涵盖十进制与二进制、八进制、十六进制之间的相互转换,以及任意进制的转换方法。内容包括除余法、权值展开法、分组转换法等核心技巧,并提供了完整的 C++ 代码实现示例。适合初学者巩固进制转换基础及提升算法思维能力。

计算机王国有一台机器,它只会说 二进制语言。输入一个十进制数字,让机器翻译成二进制。
13
1101
使用 除 2 取余法。
13 ÷ 2 = 6 余 16 ÷ 2 = 3 余 03 ÷ 2 = 1 余 11 ÷ 2 = 0 余 11101#include <iostream>
using namespace std;
int main() {
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];
}
return 0;
}
机器人只认识 二进制。但你给了它一个二进制数字,让它算出十进制是多少。
10101
21
使用 权值展开法。
1×2⁴ + 0×2³ + 1×2² + 0×2¹ + 1×2⁰16 + 4 + 1 = 21#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++) {
ans = ans * 2 + (s[i] - '0');
}
cout << ans;
return 0;
}
计算机觉得二进制太长了,于是发明了一种压缩方法:3 个二进制 = 1 个八进制。(本题中只考虑正数,不考虑负数。)
101110
56
101 110101 = 5, 110 = 6#include <iostream>
#include <string>
using namespace std;
int main() {
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;
}
return 0;
}
输入一个八进制数字,翻译成十进制。
157
111
使用 权值展开法。
1×8² + 5×8¹ + 7×8⁰64 + 40 + 7 = 111#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++) {
ans = ans * 8 + (s[i] - '0');
}
cout << ans;
return 0;
}
魔法师使用 十六进制符号:A=10, B=11, C=12, D=13, E=14, F=15。
FF
255
F = 1515×16¹ + 15×16⁰240 + 15 = 255#include <iostream>
#include <string>
using namespace std;
int main() {
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;
return 0;
}
11010110
D6
4 位一组。
1101 0110D 6#include <iostream>
#include <string>
using namespace std;
int main() {
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);
}
return 0;
}
100
144
#include <iostream>
using namespace std;
int main() {
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];
return 0;
}
255
FF
#include <iostream>
using namespace std;
int main() {
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];
return 0;
}
base = 7 number = 123
66
权值展开:1×7² + 2×7¹ + 3×7⁰
#include <iostream>
#include <string>
using namespace std;
int main() {
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;
return 0;
}
n=100 base=3
10201
#include <iostream>
using namespace std;
int main() {
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];
return 0;
}
在 计算机王国里,士兵们每天发送大量 二进制情报。国王觉得太长了,于是发明了一种 压缩魔法:每 3 个二进制数字 可以变成 1 个八进制数字。
通过十进制转换:二进制 → 十进制 → 八进制
#include <iostream>
#include <string>
using namespace std;
int main() {
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];
return 0;
}
程序员魔法师喜欢用八进制写数字,但是计算机只能看懂 二进制。
通过十进制转换:八进制 → 十进制 → 二进制
#include <iostream>
#include <string>
using namespace std;
int main() {
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];
return 0;
}
在 黑客学校,学生们用一种神秘语言。老师说:每一位十六进制都能变成 4 位二进制。
通过十进制转换:十六进制 → 十进制 → 二进制
#include <iostream>
#include <string>
using namespace std;
int main() {
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];
return 0;
}
计算机给你一个 超长二进制密码,国王要求把它翻译成 十六进制密钥。
#include <iostream>
using namespace std;
int main() {
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];
return 0;
}
在 机器人军队里:1 = 士兵, 0 = 空地。现在输入 n,转换成二进制是 1011011,请问有多少士兵?
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cnt = 0;
while (n > 0) {
if (n % 2 == 1) cnt++;
n /= 2;
}
cout << cnt;
return 0;
}
计算机想知道:一个数字需要多少 二进制位 才能表示?例如 13。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int len = 0;
while (n > 0) {
n /= 2;
len++;
}
cout << len;
return 0;
}
计算机存储数字时,常用 8 位二进制。例如 5 必须写成 00000101。
#include <iostream>
using namespace std;
int main() {
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];
return 0;
}
数字有一个 隐藏的最右边的 1。例如 12 的二进制是 1100,最低位 1 是 0100。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << (n & -n);
return 0;
}
注:需要掌握按位操作符,这是竞赛经典技巧。
本文整理了 C++ 进制转换的核心算法与实战练习,涵盖多种转换场景及代码实现。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online