a进制转b进制的转换总结

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,每行表示一组数据的答案。

输入样例

cpp 复制代码
2
2 10 
10101 
11 2
1793A5068

输出样例

cpp 复制代码
21
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;
}
相关推荐
Data_Journal5 分钟前
使用Python lxml轻松进行网络爬取
开发语言·php
xcLeigh20 分钟前
IoTDB JDBC 完整使用教程:连接、查询、批处理与字符集配置
开发语言·数据库·qt·iotdb·查询·批处理·连接
学会870上岸华师23 分钟前
C 语言程序设计——第一章课后编程题
c语言·开发语言·学习·算法
小小编程路24 分钟前
新手快速学 Python 极简速成指南
开发语言·c++·python
rabbit_pro1 小时前
SpringBoot3集成Langchain4j使用Ollama
java·开发语言
宏笋1 小时前
C++ 约束模板参数Concepts详解
c++
计算机安禾1 小时前
【c++面向对象编程】第26篇:对象的内存模型:成员变量与成员函数的存储分离
开发语言·c++·算法
郝学胜-神的一滴1 小时前
Qt 高级开发 005: Qt Creator与Visual Studio 项目双向转换
开发语言·c++·ide·qt·程序人生·visual studio
解决问题no解决代码问题1 小时前
JAVA GC
java·开发语言·jvm
澈2071 小时前
滑动窗口算法:双指针高效解题秘籍
数据结构·c++·算法