数制转换——北大
文章目录
- 题目描述
- 知识点
- 结果
- 实现
- 码前思考
- 代码实现
- 码后反思
- 二刷代码
题目描述

知识点
数制转换
结果

实现
码前思考
读题可以发现题中可能有的几个坑:
- 数据可能存在包含前导零的情况;
- 输出时字母符号全部用大写表示。
其他:
- 对于这种既有字符又有数字的转换,常见的解决办法就是初始化一张查找表,之后进行映射查表,这样会快很多。
代码实现
//输入和输出都是字符数组#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;
}
码后反思
- 题中所指的
long型其实就是C++中的int型,不要搞错成C++中的long long型了; - 对字符串数组的操作保险起见还是要设置一个变量来记录长度🙂
二刷代码
- 学会了STL,所以代码变得简单一些了:
- 使用
toupper,tolower实在是太香了! - 注意最后的输出为
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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
