基于蓝桥云课题库的刷题日记#2——进制转换

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进制,这里就不再阐述,卡时不那么严的题没必要一味追求算法简洁,可读性和可维护性也是相当重要的。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值