数制转换——北大

题目描述

在这里插入图片描述

知识点

数制转换

结果

在这里插入图片描述

实现

码前思考

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

  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 <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;
} 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值