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;
}
相关推荐
ECT-OS-JiuHuaShan2 小时前
哲学的本质,是递归因果
java·开发语言·人工智能·科技·算法·机器学习·数学建模
overmind2 小时前
oeasy Python 124 序列_字符串_string_str
开发语言·python
一个假的前端男2 小时前
Flutter 实现 BLE 设备 WiFi 配网流程实践
开发语言·flutter
tankeven2 小时前
C++ 学习杂记05:std::map
c++
片酷2 小时前
【Isaacsim&Isaaclab】安装教程
linux·开发语言·python
Magic@2 小时前
Redis学习[1] ——基本概念和数据类型
linux·开发语言·数据库·c++·redis·学习
黑不溜秋的2 小时前
C++ STL reduce 用法
开发语言·c++
倾听一世,繁花盛开2 小时前
Java语言程序设计——篇十三(1)
java·开发语言·ide·eclipse
大腕先生2 小时前
通用分页超详细介绍(附带源代码解析&页面展示效果)
xml·java·linux·服务器·开发语言·前端·idea