- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
进制转换(递归+幂的三种计算方法)
十进制转成其他进制用两种方法编码:递归、非递归。---------------------------例题:进制转换?/problem/B2143
题目描述:用递归算法将一个十进制整数?X(1≤X≤109)转换成任意进制数M(2≤M≤16,M为整数)。?
输入格式:一行两个数,第一个十进制整数X,第二个为进制M。?
输出格式:输出结果。?
输入样例
43116
输出样例
1AF
---------------------------
【考点】进制转换、短除法、递归。
【思路和证明】进制转换是计算机基础知识。
如何把十进制转成其他进制?设十进制数X的M进制是bk...b2b1b0,根据M进制的定义,有:
X=bkMk?+...+b2M2?+b1M1?+b0M0为了求十进制X的M进制bk...b2b1b0,进行以下步骤:
(1)用X除以M,得商为a0,此时余数为b0;
(2)继续用a0除以M,记商为a1,此时余数为b1;
重复步骤(2)直至商为0,倒序输出记下的余数bk...b2b1b0,就是X的M进制。
这种方法称为“短除法”。
下面以样例输入“43116”,把十进制整数431转为16进制为例。
16进制有16个数码:0、1、2、...、9、A、...、F。
第1步:431除以16,商为26,余数为F;
第2步:26除以16,商为1,余数为A;
第3步:1除以16,商为0,余数为1。结束。
答案是1AF,即倒序输出的余数。
计算过程用下图表示:
【代码展示:非递归实现】下面代码的func()给出了短除法的代码。由于要倒序输出余数,需要先用s[]存余数,计算完后在第12行倒序输出。
#include?bits/stdc++.husingnamespacestd;charch[]=0123456789ABCDEF;?//存进制的数码,能转2进制~16进制voidfunc(intx,intm){?//必须满足2≤M≤16,否则会出错??strings;??intlen=0;???while(x!=0){ s[len]=ch[x%m];?//存余数 x/=m; len++;??}??for(inti=len-1;i=0;i--)//倒序输出余数 couts[i];?}??intmain(){??intx,m;?cinxm;??func(x,m);?//短除法??return0;}
【代码展示:递归实现】倒序输出如果用递归来处理,编码非常简单。
下面把func()改成递归函数。
#includebits/stdc++.husingnamespacestd;charch[]=0123456789ABCDEF;?void?func(int?x,?int?m){????if(x/m)?func(x/m,m);//先递归:继续除??coutch[x%m];//再输出:倒序输出余数}intmain(){??intx,m;?cinxm;??func(x,m);????????//短除法??return0;}
如何倒序输出余数?在递归函数func()中,先继续递归,递归返回后再输出,就倒序输出了余数。如果先输出再递归,就是正序输出,结果是错的。
初学者请一定要掌握好递归。
本题是把十进制转换为其他进制,如果要求在任意进制间互相转换,可以用十进制中转。例如五进制转为九进制,先把五进制转为十进制,再把十进制转为九进制。
其他进制转成十进制
---------------------------
例题:X进制转10进制?/problem/B3620
题目描述:给一个小整数x和一个x进制的数S。将S转为10进制数。对于超过十进制的数码,用A,B,…表示。
输入格式:第一行一个整数x;第二行一个字符串S。?
输出格式:输出一个整数,表示答案。
输入样例
16
7B
输出样例
123
---------------------------
【考点】进制转换,pow()函数的精度问题。
【思路和证明】如何把M进制转成十进制?
设M进制数是bk...b2b1b0,转成十进制数X。根据进制的定义,有:
X=bkMk?+...+b2M2?+b1M1?+b0M0
只需按上述公式计算即可得到X。
公式中需要计算幂,有三种方法实现:
用库函数pow()
提前预计算幂
for循环递推计算幂
前2种方法下面做个测试,第3种见后面的代码。
测试代码,计算3的幂:
#includebits/stdc++.husingnamespacestd;longlong
您可能关注的文档
最近下载
- RFJ 01-2014 人民防空工程设备设施标志和着色标准.pdf VIP
- 高考名著阅读之《雷雨》.pdf VIP
- 【专升本专项训练】2022年中国计量大学语文模拟测试卷.docx
- 教师招聘考试题库《教育理论综合知识》考点预测256.docx
- NBT 31007 风电场工程勘察设计收费标准.pdf
- 高层住宅小区前期物业管理方案投标中标文件.doc VIP
- 上海中考语文试卷及答案研究报告.doc
- 形容春暖花开的优美句子200句.docx
- 人教版(2024版)七年级英语下册 Unit 2 No Rules, No Order 单元测试卷(含答案).docx VIP
- 2024年安徽工贸职业技术学院单招职业技能测试题库及答案(考点梳理).docx VIP
文档评论(0)