先用 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;
}复杂度
设输出位数为
总结
进制转换可拆成“解析为数值”和“数值重新编码”两个独立步骤。