【模拟】P1143进制转换

题目相关

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制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,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;
} 

题解视频

视频链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


输出自然数 1 到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
编写一个能够输出“`Hello,World!`”的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。&#xA;&#xA;提示:“`Hello,Worl
题目相关 【题目描述】 求10000以内n的阶乘。 【输入】 只有一行输入,整数n(0≤n≤10000)。 【输出】 一行,即n!的值。 【输入样例】 4 【输出样例】 24 分析 首先n的阶乘是从1
题目相关 原题链接:P5461 赦免战俘 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了! 题目描述 现有 $2n
水仙花数 题目描述 输出所有的&amp;quot;水仙花数&amp;quot;.所谓&amp;quot;水仙花数&amp;quot;是指这样的一个三位数:其各位数字的立方和等于该数本身。例如:371是
题目描述 奖学金 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文
已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。
题目相关 题目描述 我们要求找出具有下列性质数的个数(包含输入的正整数 n)。 先输入一个正整数 n(n ≤1000),然后对此正整数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个正整数,
题目相关 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且 r ≤n),我们可以简单地将n个元素理解为自然数1,2,…,n从中任取r个数。 现要求你输出所有组合。
题目相关 题目描述 把 m个同样的苹果放在 n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,1 和 1,1,5 是同一种方法) 输入格式 第一行是测试数据的数目 t,以下每行
题目相关 【题目描述】 求两个不超过200位的非负整数的和。 【输入】 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 【输出】 一行,即相加后的结果。结果里不能有多余的前导0,即如
请你编一程序实现两种不同进制之间的数据转换。
题目相关 【题目描述】 求两个大的正整数相减的差。 【输入】 共2行,第1行是被减数a,第2行是减数b(a &amp;gt; b)。每个大整数不超过200位,不会有多余的前导零。 【输出】 一行,即所
题目描述 一个数如果恰好等于不包含它本身所有因子之和,这个数就称为&amp;quot;完数&amp;quot;。 例如,6的因子为1、2、3,而6=1ʲʳ,因此6是&amp;quot;完数&amp
题目相关 【题目描述】 任意给定一个正整数N(N≤100),计算2的n次方的值。 【输入】 输入一个正整数N。 【输出】 输出2的N次方的值。 【输入样例】 5 【输出样例】 32 分析 本题考察的是
题目相关 【题目描述】 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数。把第二个输入的整数输出。 【输入】 只有一行,共三个整数,整数之间由一个空格分隔。整数是32位有符号整数。 【输出
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母
[toc] 707.设计双向链表 链表简介 链表(LinkedList) 是一种线性表,但不是顺序表,因为它是通过节点直接的相互引用相互联系起来的。 由于不必按顺序存储, 链表在插入和删除的时候可以达
题目描述 784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。 示例: 输入:S = &amp;quot;a1
[toc] Leetcode动态规划【简单题】 动态规划 (Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划相较于递归,拥有更