#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 ✅

🎯 核心概念理解

  1. 进制本质:不同进制只是数字的不同表示方法
  2. 权重概念:每个位置的数字乘以基数的幂次
  3. 短除法原理:通过不断除以目标基数来获取各位数字

这个算法就像数字的翻译官,让数字在不同的进制世界里自由穿梭!🌍✨ 掌握了进制转换,你就打开了理解计算机底层原理的一扇重要窗口!🚪💻