a进制转换为b进制 的核心思路是**"两步法"**:先将 a 进制字符串转为十进制整数,再将十进制整数转为 b 进制字符串。
一、10 进制转 k 进制 (大于10的数用'A' 到 'Z' 表示)
cpp
char f(int num)//int 转 char 超过9了就是'A'~'Z',没超过就是'0'~'9'
{
if(num%10<10)
return num%10+'0';
else
return num%10-10+'A';
}
string func(int num,int k)//10进制数 num 转成 k 进制数
{
string ret;
while(num)
{
ret+=f(num);
num/=k
}
reverse(ret.begin(),ret.end());
return ret;
}
二、k进制转10进制 (不仅可以处理'A'到'Z' ,还能处理大小写)
cpp
long long func(string s,int k)//k进制数转 10 进制数
{
long long ret=0,power=0;
for(int i=s.size()-1;i>=0;i--)
{
char c=toupper(s[i]); 先都转换成大写
int num;
if(isdigit(c)) 是'0' 到 '9'
{
num=c-'0';
}
else if(isalpha(c)) 是'A' 到 'Z'
{
num=c-'A'+10;
}
else
return -1;
ret=ret+num*pow(k,power);
power++;
}
return ret;
}
2026.3.13 add:
a进制数转b进制数写在一个函数中
cpp
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
// 字符与数字之间的转换辅助函数
// 将数字 0-15 转换为对应的字符 (0-9, A-F)
char digitToChar(int digit) {
if (digit >= 0 && digit <= 9) {
return '0' + digit;
} else {
return 'A' + (digit - 10);
}
}
// 将字符 (0-9, A-F) 转换为对应的数字
int charToDigit(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else {
return c - 'A' + 10;
}
}
// 核心转换函数
// 参数: strNum 是 a 进制的字符串, a 是原进制, b 是目标进制
string convertBase(string strNum, int a, int b) {
// 步骤 1: 将 a 进制字符串转换为 十进制整数
long long decimal = 0;
int power = 0;
// 从字符串末尾(最低位)开始处理
for (int i = strNum.length() - 1; i >= 0; i--) {
int digit = charToDigit(strNum[i]);
// 检查输入是否合法(例如:2进制里不能有数字2)
if (digit >= a) {
return "Error: Invalid number for base " + to_string(a);
}
decimal += digit * pow(a, power);
power++;
}
// 步骤 2: 将 十进制整数 转换为 b 进制字符串
if (decimal == 0) {
return "0";
}
string result = "";
while (decimal > 0) {
int remainder = decimal % b;
result += digitToChar(remainder);
decimal /= b;
}
// 由于我们是从低位到高位拼接的,所以需要反转
reverse(result.begin(), result.end());
return result;
}
// 测试函数
int main() {
string num;
int baseA, baseB;
cout << "请输入原进制 a: ";
cin >> baseA;
cout << "请输入目标进制 b: ";
cin >> baseB;
cout << "请输入 " << baseA << " 进制数: ";
cin >> num;
// 转换为大写,方便处理(比如十六进制的 a-f)
transform(num.begin(), num.end(), num.begin(), ::toupper);
string result = convertBase(num, baseA, baseB);
cout << "转换结果 (" << baseA << "->" << baseB << "): " << result << endl;
return 0;
}
运行结果:

三、例题
问题描述
请问十六进制数 2021ABCD 对应的十进制是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
cpp
#include <bits/stdc++.h>
using namespace std;
int f(string s,int k)//k进制转10进制数 , k=16
{
int ret=0,power=0;
for(int i=s.size()-1;i>=0;i--)
{
char c=s[i];
int tmp;
if(isalpha(c))
tmp=c-'A'+10;
else
tmp=c-'0';
ret=ret+tmp*(pow(k,power));
power++;
}
return ret;
}
int main()
{
// 请在此输入您的代码
string s("2021ABCD");
int ret=f(s,16);
cout<<ret;
return 0;
}
题目描述
给定一个 NN 进制数 SS,请你将它转换为 MM 进制。
输入描述
第一行为一个整数 TT,表示测试数据数量。 (1≤T≤1051≤T≤105)
每个测试用例包含两行,第一行包含两个整数 N,MN,M。
第二行输入一个字符串 SS,表示 NN 进制数。
数据范围保证:2≤N,M≤162≤N,M≤16,若 N≥10N≥10,则用 A∼FA∼F 表示字码 10∼1510∼15。保证 SS 对应的十进制数的位数不超过 1010。
输出描述
输出共 TT,每行表示一组数据的答案。
输入样例
cpp2 2 10 10101 11 2 1793A5068输出样例
cpp21 10101111001010100111010101011
cpp
#include <bits/stdc++.h>
using namespace std;
int func(int n,string s)//n进制转10进制
{
int ret=0,power=0;
for(int i=s.size()-1;i>=0;i--)
{
char c=s[i];
int num;
if(isdigit(c))
num=c-'0';
else
num=c-'A'+10;
ret=ret+num*(pow(n,power));
power++;
}
return ret;
}
char f(int num,int k)
{
if(num%k<10)
return num%k+'0';
else
return num%k-10+'A';
}
void func1(int num,int k)//10进制转k进制
{
string ret;
while(num)
{
ret+=f(num,k);
num/=k;
}
reverse(ret.begin(),ret.end());
cout<<ret<<endl;
}
int main()
{
// 请在此输入您的代码
int t;cin>>t;
while(t--)
{
int n,m;cin>>n>>m;//从n进制转成m进制数
string s;cin>>s;
int ret=func(n,s);
//ret是10进制数转m进制数
func1(ret,m);
}
return 0;
}