题目相关

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制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. selenium常用的标签

    1.selenium之 下拉选择框Select.反选框Deselect.options 我们通常会遇到两种下拉框,一种使用的是html的标签select,另一种是使用input标签做的假下拉框.后者我 ...

  2. js已知A,B两点坐标,在线段AB上有C点,已知AC的距离,求C点的坐标

    /** * @param {Number} _x1 A点坐标 * @param {Number} _y1 A点坐标 * @param {Number} _x2 B点坐标 * @param {Numbe ...

  3. 将ACCESS 的数据库中的表的文件 导出了EXCEL格式

    将ACCESS 的数据库中的表的文件 导出了EXCEL格式 '''' '将ACCESS数据库中的某个表的信息 导出为EXCEL 文件格式 'srcfName ACCESS 数据库文件路径 'desfN ...

  4. 【题解】AcWing 193. 算乘方的牛

    原题链接 题目描述 约翰的奶牛希望能够非常快速地计算一个数字的整数幂P(1 <= P <= 20,000)是多少,这需要你的帮助. 在它们计算得到最终结果的过程中只能保留两个工作变量用于中 ...

  5. 【译】为什么Rust中的BTreeMap没有with_capacity()方法?

    原文标题:Why doesn't Rust's BTreeMap have a with_capacity() method? 原文链接:https://www.nicolas-hahn.com/20 ...

  6. python命名切片

    命名切片 c = slice(2, 5) a = [1, 2, 3, 4, 5, 6, 7] print(a[c])

  7. Docker 安装并部署Tomcat、Mysql8、Redis

    1.  安装前检查 1 #ContOS 7安装Docker系统为64位,内核版本为3.10+ 2 lsb_release -a 3 4 uname -r 5 6 #更新yum源 7 yum -y up ...

  8. elasticsearch-head 配置

    elasticsearch-head install node.js Download node.js: 将下载的包,解压并配置环境变量  vim /etc/profile  ​ #set for n ...

  9. 行业动态 | 每日处理2500万事务数据的IoT解决方案

    借助DataStax Enterprise和其他开源的解决方案,Locstat为它的用户提供了创新的IoT解决方案,并将数据分析时间由2-3周降至数分钟内,从而快速生成用于分析的图数据.不仅如此,现在 ...

  10. 这个 bug 让我更加理解 Spring 单例了

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...