题目描述
知识点
数制转换
结果
实现
码前思考
读题可以发现题中可能有的几个坑:
- 数据可能存在包含前导零的情况;
- 输出时字母符号全部用大写表示。
其他:
- 对于这种既有字符又有数字的转换,常见的解决办法就是初始化一张查找表,之后进行映射查表,这样会快很多。
代码实现
//输入和输出都是字符数组
#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 <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <unordered_map>
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;
}