网站大量收购独家精品文档,联系QQ:2885784924

进制转换(递归+幂的三种计算方法).docx

进制转换(递归+幂的三种计算方法).docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

xiaobao + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档