这段代码实现了进制转换的功能,将一个给定的数字从一种进制转换为另一种进制。具体来说,它将一个数字从 n 进制转换为 m 进制。以下是代码的详细思路解析:


1. 问题背景

给定一个数字(以字符串形式表示),其当前进制为 n,目标是将其转换为 m 进制。输入包括:

  • n:当前进制。

  • num:数字(以字符串形式表示)。

  • m:目标进制。

2. 代码逻辑解析

(1) n 进制转换为十进制
int len = num.size(); 
for (int i = len - 1, k = 0; i >= 0; i--, k++) 
{   
    int tmp;
    if (num[i] >= 'A' && num[i] <= 'F') 
        tmp = num[i] - 'A' + 10;
    else
        tmp = num[i] - '0'; 

    ten += tmp * pow(n, k); 
}
  • 功能:将 n 进制的数字转换为十进制。

  • 逻辑:

    1. 初始化:

      • len:数字的长度。

      • ten:用于存储十进制结果。

    2. 逐位转换:

      • 从最低位到最高位逐位处理数字。

      • 如果当前字符是字母(A 到 F),将其转换为对应的十进制值(10 到 15)。

      • 如果当前字符是数字(0 到 9),直接转换为对应的十进制值。

      • 将当前位的值乘以 n 的幂(pow(n, k)),并累加到 ten 中。

(2) 十进制转换为 m 进制
char result[100]; 
int index = 0;
while (ten)
{   
    int u = ten % m;
    ten /= m; 
    char tmp;

    if (u < 10)
        tmp = u + '0';
    else
        tmp = u + 'A' - 10;
    
    result[index++] = tmp;
}
  • 功能:将十进制数字转换为 m 进制。

  • 逻辑:

    1. 初始化:

      • result:用于存储 m 进制的结果。

      • index:用于记录结果数组的索引。

    2. 逐位转换:

      • 使用一个循环,直到 ten 为 0。

      • 计算当前位的值 u(ten % m)。

      • 如果 u 小于 10,将其转换为对应的字符('0' 到 '9')。

      • 如果 u 大于等于 10,将其转换为对应的字母('A' 到 'F')。

      • 将当前位的字符存储到 result 中。

(3) 输出结果
for (int i = index - 1; i >= 0; i--) 
{
    cout << result[i];
}
cout << endl;
  • 功能:从高位到低位输出结果。

  • 逻辑:

    • 由于结果数组是从低位到高位存储的,因此需要从数组的末尾开始输出。


3. 总结

这段代码的核心思路是通过两次进制转换实现从 n 进制到 m 进制的转换:

  1. n 进制转换为十进制:逐位处理数字,将每一位的值乘以 n 的幂,累加到结果中。

  2. 十进制转换为 m 进制:逐位处理十进制数字,将每一位的值存储到结果数组中。

  3. 输出结果:从高位到低位输出结果数组中的字符。

这种方法适用于处理不同进制之间的转换,时间复杂度为 O(d),其中 d 是数字的位数。

完整代码

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
    string num;
    int n, m, ten = 0; 
    cin >> n >> num >> m;

    // 1、n进制转换为十进制
    int len = num.size(); 
    for (int i = len - 1, k = 0; i >= 0; i--, k++) 
    {   
        int tmp;
        if (num[i] >= 'A' && num[i] <= 'F') 
            tmp = num[i] - 'A' + 10;
        else
            tmp = num[i] - '0'; 

        ten += tmp * pow(n, k); 
    }

    // 2、十进制转换为m进制,使用数组进行存储
    char result[100]; 
    int index = 0;
    while (ten)
    {   
        int u = ten % m;
        ten /= m; 
        char tmp;

        if (u < 10)
            tmp = u + '0';
        else
            tmp = u + 'A' - 10;
        
        result[index++] = tmp;
    }

    // 3、输出答案
    for (int i = index - 1; i >= 0; i--) 
    {
        cout << result[i];
    }
    cout << endl;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);	
    solve();
    return 0;
}
    

更多推荐