数制转换

GitHub跳转原题关系图返回列表

先用 int 按原进制解析,再用除基取余将结果转换为目标进制。

OJ: noi_openjudge

题目 ID: ch0113-01

难度:入门

标签:进制转换模拟python

日期: 2026-07-30 23:01

题意

将 2 到 16 进制的非负整数转换到另一个进制,字母部分统一使用大写输出。

思路

Python 的 int(text, base) 可直接将原进制数字转为整数。再不断执行 divmod(value, target_base),余数就是从低到高的目标进制位,最后反转即可。零要单独处理。

代码

Python代码

python
source_base, source_number, target_base = input().split()
value = int(source_number, int(source_base))
digits = "0123456789ABCDEF"

if value == 0:
    print(0)
else:
    converted = []
    while value:
        value, remainder = divmod(value, int(target_base))
        converted.append(digits[remainder])
    print("".join(reversed(converted)))

C++代码

cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a,b;
char str[100];
LL len;
char z[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

vector<char> v;
/* n 进制  -> 10 进制 */
LL toDec(){
    LL sum = 0;
    LL t = 1;
    int i;
    for(i=len;i>=1;i--){
        sum +=  (str[i]*t);
        t *= a;
    }
    //printf("%lld\n",sum);
    return sum;
}
/* 10 进制  -> n 进制 */
void toN(LL x){
    while( x ){
        int t = x % b;
        v.push_back(z[t]);
        x /=b;
    }
}
int main(){
    scanf("%lld",&a);
    scanf("%s",str+1);
    len = strlen(str+1);
    if( len == 1 && str[1] == '0'){
        printf("0");
        return 0;
    }
    scanf("%lld",&b);
    int i;
    for(i=1;i<=len;i++){
        char &c = str[i];
        if( c >='0' && c<='9')
            str[i] -='0';
        else if( c >='a' && c <='z')
            str[i] -=('a'-10);
        else if( c >='A' && c <='Z')
            str[i] -=('A'-10);
    }
    toN(toDec());
    reverse(v.begin(),v.end());
    for (const auto& e : v) {
        printf("%c",e);
    }

    return 0;
}

复杂度

设输出位数为 kk,时间复杂度为 O(k)O(k),空间复杂度为 O(k)O(k)

总结

进制转换可拆成“解析为数值”和“数值重新编码”两个独立步骤。