数制转换——北大

文章目录

  • 题目描述
  • 知识点
  • 结果
  • 实现
    • 码前思考
    • 代码实现
    • 码后反思
  • 二刷代码

题目描述

在这里插入图片描述

知识点

数制转换

结果

在这里插入图片描述

实现

码前思考

读题可以发现题中可能有的几个坑:

  1. 数据可能存在包含前导零的情况;
  2. 输出时字母符号全部用大写表示。

其他:

  1. 对于这种既有字符又有数字的转换,常见的解决办法就是初始化一张查找表,之后进行映射查表,这样会快很多。

代码实现

//输入和输出都是字符数组#include "bits/stdc++.h"
using namespace std;const int maxn = 1000;//输入数组 
char input[maxn];
//输出数组 
char output[maxn]; 
int lenO;
//原始进制
int a;
//转换进制
int b;
//十进制的数值 
long long num;//使用两个map来存储映射关系 
map<char,int> mpToTen; 
map<int,char> mpToB; void toTen(char input[]){int len = strlen(input);for(int i=0;i<len;i++){num = num*a + mpToTen[input[i]]; }
} void toB(char output[]){lenO=0;do{output[lenO++]	=  mpToB[num % b];num = num / b;}while(num != 0);
}int main(){char base = '0';for(int i=0;i<10;i++){mpToTen[base+i] = i;}base = 'A';for(int i=0;i<6;i++){mpToTen[base+i] = i+10;}base = 'a';for(int i=0;i<6;i++){mpToTen[base+i] = i+10;}base = '0';for(int i=0;i<10;i++){mpToB[i] = base+i;}base = 'A';for(int i=0;i<6;i++){mpToB[i+10] = base+i; }while(~scanf("%d",&a)){//读入数据 scanf("%s",input);scanf("%d",&b);//共享数据结构进行初始化 num = 0;lenO = 0;strcpy(output,"");toTen(input);toB(output);for(int i=0;i<lenO;i++){printf("%c",output[lenO-i-1]);}printf("\n");}return 0;
} 

码后反思

  1. 题中所指的long型其实就是C++中的int型,不要搞错成C++中的long long型了;
  2. 对字符串数组的操作保险起见还是要设置一个变量来记录长度🙂

二刷代码

  1. 学会了STL,所以代码变得简单一些了:
  2. 使用toupper,tolower实在是太香了!
  3. 注意最后的输出为char类型;
#include 
#include 
#include 
#include 
#include 
using namespace std;unordered_map<char,int> c2n;
unordered_map<int,char> n2c;int main(){//初始化映射for(int i=0;i<=9;i++){c2n['0'+i] = i;n2c[i] = '0'+i;}for(int i=0;i<=5;i++){c2n['A'+i] = i+10;n2c[i+10] = 'A'+i;}int a;string n;int b;while(scanf("%d",&a)!=EOF){cin>>n;scanf("%d",&b);long long dec=0;vector<char> res;//进制转换for(int i=0;i<n.size();i++){dec = dec*a+c2n[toupper(n[i])];}//printf("dec:%d\n",dec);//进制转换do{res.push_back(n2c[dec%b]);dec=dec/b;}while(dec!=0); for(int i=0;i<res.size();i++){printf("%c",res[res.size()-1-i]);}printf("\n");}return 0;
} 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部