题目相关

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制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'&&num[i]<='9'){//'0'~'9'
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转二进制为例:

\[\begin{array}{lr}
&10 \div 2 = 5 \dots 0 \\
&5 \div 2 = 2 \dots 1 \\
&2 \div 2 = 1 \dots 0 \\
&1 \div 2 = 0 \dots 1
\end{array}
\]

将余数倒着,从下往上组合,就是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<=9){//数字 0~9 转成 字符'0'~'9'
tmp[len]=u+'0';
}else{
tmp[len]=u+'A'-10;//数字 10~15 转成 字符'A'~'F'
}
len++;
}
for(int i=0;i<len;i++){//倒着处理
ans[i]=tmp[len-1-i];
}
}

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

代码实现

#include <iostream>
#include <cstring>
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'&&num[i]<='9'){//'0'~'9'
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<=9){//数字 0~9 转成 字符'0'~'9'
tmp[len]=u+'0';
}else{
tmp[len]=u+'A'-10;//数字 10~15 转成 字符'A'~'F'
}
len++;
}
for(int i=0;i<len;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);
cout<<ans;
return 0;
}

题解视频

视频链接

【模拟】P1143进制转换的更多相关文章

  1. 洛谷——P1143 进制转换

    P1143 进制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进 ...

  2. 洛谷 P1143 进制转换

    P1143 进制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进 ...

  3. 洛谷P1143 进制转换

    题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10 ...

  4. P1143 进制转换

    漂亮小姐姐点击就送:https://www.luogu.org/problemnew/show/P1143 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 输入数据共 ...

  5. (进制转换 栈)P1143 进制转换 洛谷

    题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10n> ...

  6. 集训作业 洛谷P1143 进制转换

    这个题目就是让我们实现进制的转换. 我只会很简单的把他从一个别的进制转化成10进制,然后再继续转化成目标进制. #include<iostream> #include<cstdio& ...

  7. HDU4814——数学,模拟进制转换

    本题围绕:数学公式模拟进制转换 HDU4814 Golden Radio Base 题目描述 将一个十进制的非负整数转换成E(黄金分割数)进制的数 输入 不大于10^9的非负整数,处理到文件尾 输出 ...

  8. C++笔记(7)——一些模拟题:简单模拟、查找元素、图形输出、日期处理、进制转换、字符串处理

    以下内容基本来自<算法笔记>,作者为胡凡,建议直接买书看,我这里只是摘抄部分当笔记,不完整的. 简单模拟 就是一类"题目怎么说你就怎么做"的题目.这类题目不涉及算法,只 ...

  9. 【轻院热身赛】级数求和、进制转换、candy

    [题目链接:级数求和] Problem A: 级数求和 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 409  Solved: 240 SubmitSt ...

随机推荐

  1. Windows下MySQL无法启动万能解决方案

    MySQL启动报错 window10上安装了MySQL之前使用都是执行net start mysql 启动,执行net stop mysql关闭. 某天开始启动报错"MySQL 服务无法启动 ...

  2. 串口数据监视 Serial Port Monitor

    串口数据监视工具 Serial Port Monitor可以在其它应用读写串口时监视串口数据, 很好用,但只有15天试用期.

  3. 【Luogu P5168】xtq玩魔塔(Kruskal 重构树 & 树状数组 & set)

    Description 给定一个 \(n\) 个顶点,\(m\) 条边的无向联通图,点.边带权. 先有 \(q\) 次修改或询问,每个指令形如 \(\text{opt}\ x\ y\): \(\tex ...

  4. Salesforce 系列(一):云服务和 Salesforce 理念简介

    本系列文章系笔者在 Salesforce 开发过程中的些许总结与心得,旨在记录自己的成长,以及为对 Salesforce 感兴趣的小伙伴提供一些帮助,如有疏漏,还望多多包涵 ~ 云服务 云服务,也称云 ...

  5. DVWA各等级命令注入漏洞

    漏洞描述 在web程序中,因为业务功能需求要通过web前端传递参数到后台服务器上执行,由于开发人员没有对输入进行严格过滤,导致攻击者可以构造一些额外的"带有非法目的的"命令,欺骗后 ...

  6. ⑥SpringCloud 实战:引入gateway组件,开启网关路由功能

    这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  7. 安装xshell6

    xshell作为一个强大的安全终端模拟软件,深受广大人民喜爱,本文将介绍如何在Windows环境下安装最新版本的xshell客户端. 一,下载 1,打开官网下载链接https://www.netsar ...

  8. springmvc使用路径变量后再进行页面跳转会出现路径错误问题

    学习<Servlet.JSP和SpringMVC学习指南>遇到的一个问题,记录下. 项目代码 现象 @RequestMapping(value = "/book_edit/{id ...

  9. Redis 基础知识点总结

    关系型数据库 VS 非关系型数据库(NoSQL) 关系型数据库 我们过去使用的 mysql.Oracle 都属于关系型数据库.关系型数据库的特点是数据表之间可以存在联系,表内每列数据也存在关联,同时支 ...

  10. 在wildfly中使用SAML协议连接keycloak

    目录 简介 OpenID Connect和SAML SAML的工作流程 在keycloak中使用SAML 准备wildfy和应用程序 简介 我们知道SSO的两个常用的协议分别是SAML和OpenID ...