测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A41112. 正整数的任意进制转换

填空题 中等

题目描述

正整数的任意进制转换

题目描述

将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为[2,36],其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考虑小写字母。

输入格式

一共1+m 行:

第1行为 m,表示后面有 m 行(1 <= m <= 60).

其后的m行中,每行3个数: 进制p,p进制数n,以及进制 q。

三个数之间用逗号间隔。

n 的长度不超过50位。

输出格式

转换后的 q 进制数。

样例输入

6

18,2345678A123,18

15,23456,18

12,2345678,20

16,12345678,23

25,3456AB,21

18,AB1234567,22

样例输出

2345678A123

114E0

22B7A4

21A976L

7C2136

参考答案

#include <iostream> #include <cstring> using namespace std; char c[36]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H' ,'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','S','Y','Z'}; int a[55],b[100000];//a为原数,b为答案 int p,q; char n[55];//n为原数的字符串 int main() { int m; cin>>m; while (m--){ cin>>p; getchar(); cin.getline(n, sizeof(n),','); cin>>q;//输入 int len=strlen(n);//转化为数字 for (int i = 0; i < len; ++i) { a[i]=(n[i]>='A')?(n[i]-'A'+10):(n[i]-'0'); } int k=0,flag=1;//k为答案的位数,flag用于标记结束情况 while(1){ int ans=0,temp=0; for (int i = 0; i < len; ++i) {//除k取余 ans=(a[i]+temp*p)%q; a[i]=(a[i]+temp*p)/q; temp=ans; } b[k++]=ans; for (int i = 0; i < len; ++i) {//遍历查看是否还有数字不为0的情况 if(a[i]!=0){ flag=0; break; } flag=1; } if(flag)break; } for (int i = k-1; i >=0 ; i--) {//输出 cout<<c[b[i]]; } cout<<endl; } return 0; }
上一题 下一题