题目相关

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制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. john破解kali密码

    实验环境:kali 实验工具:john 所用命令: 1.查看/etc目录下的shadow文档,此文档记录了所有用户的用户名及密码hash值 2.使用命令echo 用户名:密码 > shadow, ...

  2. 【题解】P3631 [APIO2011]方格染色

    很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...

  3. 新挖个坑,准备学习一下databricks的spark博客

    挖坑 https://databricks.com/blog 一.spark3.0特性(Introducing Apache Spark 3.0) 1.通过通过自适应查询执行,动态分区修剪和其他优化使 ...

  4. Linux下基于.NET5开发CAX应用

    <<.NET5下的三维应用程序开发>>一文中介绍了如何在.NET5下使用AnyCAD开发应用程序.相比.NET4.x,.NET5一大进步便是可以跨平台,即可以在Linux.Ma ...

  5. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

  6. 本科入行可能吗?做到这3点,斩获BAT offer不是梦

    大家好,前两天有一个小伙伴加我微信咨询.他说他不想读研,想要直接本科毕业就参与工作.但是又担心自己由于没有学历优势,无法在校招当中获得机会,于是便来向我请教,能不能指点迷津提供一些具体的实操性措施.与 ...

  7. jmeter性能测试-高并发分布式部署

    jmeter什么要做分布式部署? jmeter是运行在JVM虚拟机上的,当模拟大量并发时,对运行机器的性能/网络负载会很大. 此时就需要使用jmeter的分布式部署功能,实现多台被控机器同时并发访问被 ...

  8. OpenSNS后台文件上传漏铜分析

    前言 这几天正在想找个文件上传漏洞分析一波,以加深对文件上传漏洞的理解,正好看到FreeBuf的一片文章记对OpenSNS的一次代码审计,由于其只对漏洞进行复现,故在此进行代码层面的分析. 漏洞分析 ...

  9. 【Java】Java Win10环境搭建--JDK、Eclipse

    win10安装Java JDK环境及Eclipse安装使用(Hello world) win10环境下安装Java环境,对于小白来说简直是头疼,因为Java内部环境有着JDK和JRE两块,互相牵扯着很 ...

  10. Asp.Net Core使用MongoDB

    MongoDB 是一个基于分布式且面向文档存储的开源 NoSql数据库系统 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构 ...