#5516. 进制转换笔记
进制转换笔记
🔢 进制转换算法详解
🎯 算法概述
这段代码实现了一个通用的进制转换工具,可以将任意进制的数字字符串转换为另一个进制的数字字符串。特别添加了对输入为"0"的特殊处理,让转换更加完善!✨
📋 完整代码实现
#include<bits/stdc++.h>
using namespace std;
string a, ans = ""; // 📦 定义输入字符串和结果字符串
int main() {
// 🎯 把n进制a转换成m进制
int n, m;
cin >> n >> a >> m;
// 🚨 特殊情况处理:输入为0
if(a == "0") {
cout << 0;
return 0;
}
// 🔄 n进制a先转成十进制
int t = 1, s = 0; // t是权重,s是十进制结果
for(int i = a.size() - 1; i >= 0; i--) {
if(a[i] >= 'A' && a[i] <= 'Z')
// 🅰️ 处理A-Z字母 (A=10, B=11, ..., Z=35)
int x=a[i]-('A'-10);
s += x * t;
else
// 🔢 处理0-9数字
int x=a[i]-'0';
s += x * t;
t = t * n; // 🏋️ 更新权重
}
// 🔄 把十进制s转成m进制 - 短除法
while(1) {
int t = s % m; // 🎯 求余数
char c = t + '0'; // 🔤 转换为字符
if(t >= 10)
c = t + ('A'-10); // 🅰️ 大于10的用字母表示 (10=A, 11=B, ..., 35=Z)
ans = c + ans; // 📝 拼接到结果前面(实现倒序)
s = s / m; // 🧮 更新商
if(s == 0) break; // 🏁 商为0时结束
}
cout << ans; // 🖨️ 输出结果
return 0;
}
🎨 算法原理详解
🔄 转换流程概述
n进制字符串 → 十进制数字 → m进制字符串
↳ 权重展开法 ↳ 短除法
🔄 第一步:n进制 → 十进制(权重展开法)
📐 数学原理
对于n进制数:dₖdₖ₋₁...d₁d₀
十进制值 = dₖ × nᵏ + dₖ₋₁ × nᵏ⁻¹ + ... + d₁ × n¹ + d₀ × n⁰
💻 代码实现分析
// 🔄 n进制a先转成十进制
int t = 1, s = 0; // t是权重,s是十进制结果
for(int i = a.size() - 1; i >= 0; i--) {
if(a[i] >= 'A' && a[i] <= 'Z')
s += (a[i] - 55) * t; // 🅰️ 处理A-Z字母
else
s += (a[i] - '0') * t; // 🔢 处理0-9数字
t = t * n; // 🏋️ 更新权重
}
🔍 字符到数字的转换规则:
| 字符 | ASCII码 | 转换公式 | 结果数字 |
|---|---|---|---|
'0' |
48 | '0' - '0' |
0 |
'1' |
49 | '1' - '0' |
1 |
| ... | |||
'9' |
57 | '9' - '0' |
9 |
'A' |
65 | 'A' - 55 |
10 |
'B' |
66 | 'B' - 55 |
11 |
| ... | |||
'Z' |
90 | 'Z' - 55 |
35 |
🧮 示例演示:16进制"1F"转十进制
原始字符串: "1F" (16进制)
从右往左处理:
第1位:'F' (15)
s += 15 × 1 = 15
t = 1 × 16 = 16
第0位:'1' (1)
s += 1 × 16 = 16
总计:15 + 16 = 31 ✅
验证:1×16¹ + 15×16⁰ = 16 + 15 = 31 ✅
🔄 第二步:十进制 → m进制(短除法)
📐 数学原理
不断用十进制数除以m,记录余数,
直到商为0,余数倒序排列即为结果。
💻 代码实现分析
// 🔄 把十进制s转成m进制 - 短除法
while(1) {
int t = s % m; // 🎯 求当前余数
char c = t + '0'; // 🔤 数字转字符
if(t >= 10)
c = t + 55; // 🅰️ 10→A, 11→B, ..., 35→Z
ans = c + ans; // 📝 新字符加到结果前面(实现倒序)
s = s / m; // 🧮 更新商
if(s == 0) break; // 🏁 商为0时结束
}
🔍 数字到字符的转换规则:
| 数字 | 转换公式 | 结果字符 |
|---|---|---|
| 0 | 0 + '0' |
'0' |
| 1 | 1 + '0' |
'1' |
| ... | ||
| 9 | 9 + '0' |
'9' |
| 10 | 10 + 55 |
'A' |
| 11 | 11 + 55 |
'B' |
| ... | ||
| 35 | 35 + 55 |
'Z' |
🧮 示例演示:十进制31转16进制
s = 31, m = 16
第1次循环:
t = 31 % 16 = 15 → 'F'
ans = "F"
s = 31 / 16 = 1
第2次循环:
t = 1 % 16 = 1 → '1'
ans = "1" + "F" = "1F"
s = 1 / 16 = 0 → 结束
结果:"1F" ✅
验证:1×16¹ + 15×16⁰ = 16 + 15 = 31 ✅
🎪 完整转换示例
🔄 示例1:16进制转2进制
输入:16 1F 2
步骤:
1. 16进制"1F" → 十进制:31
2. 十进制31 → 2进制:11111
输出:11111 ✅
🔄 示例2:10进制转16进制
输入:10 255 16
步骤:
1. 10进制"255" → 十进制:255
2. 十进制255 → 16进制:
255 ÷ 16 = 15 余 15 → 'F'
15 ÷ 16 = 0 余 15 → 'F'
结果:"FF"
输出:FF ✅
🔄 示例3:8进制转20进制
输入:8 777 20
步骤:
1. 8进制"777" → 十进制:511
2. 十进制511 → 20进制:
511 ÷ 20 = 25 余 11 → 'B'
25 ÷ 20 = 1 余 5 → '5'
1 ÷ 20 = 0 余 1 → '1'
结果:"15B"
输出:15B ✅
🎯 核心概念理解
- 进制本质:不同进制只是数字的不同表示方法
- 权重概念:每个位置的数字乘以基数的幂次
- 短除法原理:通过不断除以目标基数来获取各位数字
这个算法就像数字的翻译官,让数字在不同的进制世界里自由穿梭!🌍✨ 掌握了进制转换,你就打开了理解计算机底层原理的一扇重要窗口!🚪💻