乐愚社区Beta

 编程语言  >  【模拟】进制转换题解(C++)

【模拟】进制转换题解(C++)

爱学习的咸鱼君  L0  • 2020-12-01 • 回复 3 • 最后编辑于2020-12-01 23:30 • 只看楼主举报    

题目相关

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A-F表示数码10-15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。

输出格式

一个正整数,表示转换之后的m进制数。

输入输出样例

输入

16

FF

2

输出

11111111

分析

阅读完题目之后可以发现,其实就是求解一个N进制的数字如何转成M进制的数字。那么我们就思考下应该如何进行处理。我们可以通过10进行进行中转。先将N进制转成10进制,再将10进制转成M进制。

N进制转成10进制

首先,N进制如何转换成10进制。一般来说都是按权相加。将N进制从右向左进行扫描,将每一位数拿下并与N的次方值进行相乘,次方数从零开始,从右向左,逐渐加一。权值总和就是求出的10进制值。我们以二进制数0110为例,看如何求解出10进制内容。

次方数 3 2 1 0
二进制 0 1 1 0
权值 $0\times 2^3$ $1\times 2^2$ $1\times 2^1$ $0\times 2^0$
0 4 2 0

总和就等于4+2=6

需要注意的是如何N进制大于10,就可能出现A ~ F的字符,分别对应10 ~ 15。那么N进制值可以使用字符串形式进行输入。在计算时在转成对应的整数即可。

int nToTen(int n,char num[]){
int len=strlen(num);
int ten=0;
int cf=1;//N的次方值
for(int i=len-1;i>=0;i--){//从右向左扫描
if(num[i]>=\'0\'&#[i] ten+=(num[i]-\'0\')*cf;//利用ASCII码值的连续性和差值进行转换
}else{//\'A\'~\'F\'
ten+=(num[i]-\'A\'+10)*cf;//利用ASCII码值的连续性和差值进行转换
}
cf*=N;//更新次方值
}
return ten;//返回十进制内容
}

10进制转成M进制

对于十进制转M进制,我们可以利用短除法进行处理。不断将数字除以M,保留余数,直到商的值为零,将余数倒着组合,形成的数字就是M进制的值。以十进制10转二进制为例: 将余数倒着,从下往上组合,就是1010。

void tenToM(int ten,int m,char ans[]){
char tmp[35]={0};//存储余数
int len=0;//余数个数
while(ten!=0){
int u=ten%m;//分离余数
ten/=m;
if(u>=0&&u tmp[len]=u+\'0\';
}else{
tmp[len]=u+\'A\'-10;//数字 10~15 转成 字符\'A\'~\'F\'
}
len++;
}
for(int i=0;i ans[i]=tmp[len-1-i];
}
}

两个步骤都理清了,那么两步合并一下就可以了。

代码实现

#include
#include
using namespace std;
int nToTen(int n,char num[]){
int len=strlen(num);
int ten=0;
int cf=1;//N的次方值
for(int i=len-1;i>=0;i--){//从右向左扫描
if(num[i]>=\'0\'&#[i] ten+=(num[i]-\'0\')*cf;//利用ASCII码值的连续性和差值进行转换
}else{//\'A\'~\'F\'
ten+=(num[i]-\'A\'+10)*cf;//利用ASCII码值的连续性和差值进行转换
}
cf*=n;//更新次方值
}
return ten;//返回十进制内容
}
void tenToM(int ten,int m,char ans[]){
char tmp[35]={0};//存储余数
int len=0;//余数个数
while(ten!=0){
int u=ten%m;//分离余数
ten/=m;
if(u>=0&&u tmp[len]=u+\'0\';
}else{
tmp[len]=u+\'A\'-10;//数字 10~15 转成 字符\'A\'~\'F\'
}
len++;
}
for(int i=0;i ans[i]=tmp[len-1-i];
}
}
int main(){
int N,M;
char num[35]={0},ans[35]={0};
cin>>N>>num>>M;
int ten=nToTen(N,num);
tenToM(ten,M,ans);
coutreturn 0;
}

题解视频

视频链接


3条回帖
Walker  管理员   L12  评论于
(0)  回复(2) 1#

gitee建议使用markdown编辑器,大部分语法都支持,除了一小部分高级的暂不支持,可以一键解析过来,但是图片还是建议重新上传下,可能gitee会有防盗链

Walker :gitee没有防盗链更好,我们可以白嫖他的图片了github是没有的,但是github国内打开比较慢
发表在2020-12-01 回复
爱学习的咸鱼君 楼主 :谢谢提醒
发表在2020-12-02 回复
  
:)
还没注册帐号?快来注册社区帐号,和我们一起嗨起来!
关于本社区

集各类兴趣爱好于一身的轻量化交流社区,在此您可以和他人一起分享交流您觉得有价值的内容,社区鼓励大家发表原创内容,为社区添砖加瓦!

发帖奖励 → 社区版规 → 招聘版主 →
推荐版块
扫描二维码下载社区APP
回到顶部