进制转换(模拟)

2.进制转换 - 蓝桥云课

 

题目描述

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

输入样例

2
2 10 
10101 
11 2
1793A5068

输出样例

21
10101111001010100111010101011
#include <bits/stdc++.h>

using namespace std;

// #define int long long
#define endl '\n'
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<int, int>;

const int N = 1e4 + 5;
// 十进制转任意进制
string decimalToBase(int num, int base) {
  if (num == 0) return "0";

  string result;
  while (num > 0) {
    int remainder = num % base;
    char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
    result.push_back(digit);
    num /= base;
  }

  reverse(result.begin(), result.end());
  return result;
}

// 任意进制转十进制
int baseToDecimal(const string& num, int base) {
  int decimal = 0;
  for (size_t i = 0; i < num.length(); i++) {
    char c = num[i];
    int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
    decimal = decimal * base + digit;
  }
  return decimal;
}

// 任意进制之间的转换
string convertBase(const string& num, int fromBase, int toBase) {
  int decimal = baseToDecimal(num, fromBase);
  return decimalToBase(decimal, toBase);
}
void solve() {
  int n, m;
  string s;
  cin >> n >> m;
  cin >> s;
  cout << convertBase(s, n, m) << endl;
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t;
  cin >> t;
  while (t--) solve();

  return 0;
}

/*
 *                        _oo0oo_
 *                       o8888888o
 *                       88" . "88
 *                       (| -_- |)
 *                       0\  =  /0
 *                     ___/`---'\___
 *                   .' \\|     |// '.
 *                  / \\|||  :  |||// \
 *                 / _||||| -:- |||||- \
 *                |   | \\\  - /// |   |
 *                | \_|  ''\---/''  |_/ |
 *                \  .-\__  '-'  ___/-. /
 *              ___'. .'  /--.--\  `. .'___
 *           ."" '<  `.___\_<|>_/___.' >' "".
 *          | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 *          \  \ `_.   \_ __\ /__ _/   .-` /  /
 *      =====`-.____`.___ \_____/___.-`___.-'=====
 *                        `=---='
 *
 *
 *      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *            佛祖保佑       永不宕机     永无BUG
 */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值