1230进制转换
进制本质上是每一位数字所带的权,比如十进制第一位最大可以表示9,满10进一,同理表示2进制,4进制等若干进制。
干讲略显乏力,这里直接粘上题目。
题目描述
给定一个N进制数S,请你将它转换为 M进制
输入描述
第一行为一个整数T,表示测试数据数量。(1<=t<=10^5)每个测试用例包含两行,第一行包含两个整数 N,M.
第二行输入一个字符串S,表示N 进制数
数据范围保证:2<=N,M<=16,若N>=10,则用A~F表示字码10~15。保证S对应的十进制数的位数不超过10。
输出描述
输出共T行,每行表示一组数据的答案
附上蒟蒻AC代码
#include <iostream>
#include <cstring>
using namespace std;
char record[]={"0123456789ABCDEF"};//直接打表,后面按角标使用就行,实现字母和数字的相通
char input[40];
char output[40];
int main (){
int t,mod1,mod2;//mod1,mod2分别表示两个进制
long long sum;//数据是10的九次方量级,有可能爆掉int,long long保险
cin>>t;
while(t--){
int j=0;
memset(input,0,sizeof(input));//每次循环清空数组
memset(output,0,sizeof(output));
int re=1;//每一数位的权值也要初始化,后面有累乘操作
sum=0;
cin>>mod1>>mod2;
getchar();//输入字符串之前一定要注意会不会有回车打进去,需不需要getchar吃掉
cin>>input;
for(int i=strlen(input)-1;i>=0;i--){
//这里注意处理的时候要从后往前处理,因为最小位在数组的末位
if(input[i]>='0'&&input[i]<='9'){//这里就是把ABCDEF到十进制数的转变
sum+=(input[i]-'0')*re;
}else sum+=(input[i]-'A'+10)*re;
re*=mod1;//比方十进制第一位是10^0,第二位是10^1,第三位是10^2,其他进制也一样。
}
if(sum==0) cout<<0;//可能没什么用的特判,怕给个0不进循环
while(sum>0){
int re=sum%mod2;//这里就是从最小位开始录入的
output[j++]=record[re];//不确定有多少位输出就可以用while,录入可以用j++这样的方式
sum/=mod2;//也就是说output数组的首位其实是输出的数的末位,除法是乘法的逆操作,除的越多带权越大,在数字中越靠前
}
for(int i=j-1;i>=0;i--){//上面j++多出来一位记得减下去,也可以用++j,记得初始值就要变成-1
cout<<output[i];//倒着输出
}
cout<<'\n';
}
return 0;
}
本蒟蒻采用的是先把N进制数转化为十进制,再把十进制转化为M进制,优点是可读性比较高,也好维护,理论上讲也可以直接把N进制转化到M进制,这里就不再阐述,卡时不那么严的题没必要一味追求算法简洁,可读性和可维护性也是相当重要的。