十进制转化为b进制,2的幂次方表示(C++)

题目1:将非负十进制整数n转换成b进制。(其中b=2~16)

题目2:任何一个正整数都可以用2的幂次方表示。例如:

137=2^7+2^3+2^0    

  同时约定幂次方用括号来表示,即ab 可表示为a(b)。

   由此可知,137可表示为:

   2(7)+2(3)+2(0)

  进一步:7= 2^2+2+2^0   (21用2表示)

   3=2+2^0  

  所以最后137可表示为:

   2(2(2)+2+2(0))+2(2+2(0))+2(0)

   又如:

   1315=2^10 +2^8 +2^5 +2+2^0

  所以1315最后可表示为:

   2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入:正整数(n≤20000)

输出:符合约定的n的0,2表示(在表示中不能有空格)

输入格式 Input Format

        一个正整数

输出格式 Output Format      

        符合约定的n的0,2表示(在表示中不能有空 格)

样例输入 Sample Input

73

样例输出 Sample Output      

 2(2(2)+2)+2(2+2(0))+2(0)

 

基本要求:

  1. 完成题目1,采用递归思想编程解决问题,要求设计出递归模型(递归出口和递归体的函数式)。
  2. 程序设计风格良好,实现功能测试代码,确保程序的健壮性。
  3. 画出递归树或者递归栈的调用过程。
  4. 实现非递归方法。

提高要求:

  1. 完成题目2,同时设计出递归模型。
  2. 确保良好设计风格,完整的进行测试和调试。

.题目分析

 A.题目1

  1. 完成题目2,同时设计出递归模型。
  2. 确保良好设计风格,完整的进行测试和调试。

a.递归:将非负十进制整数n转换为b进制数(b=2~16),将n/b的商作为新的十进制数n进行进制转换,将a%b的余数作为最终结果的最后一位,如此不断递归调用conversion_1(n,b),直到n=0结束。

十进制转化为b进制,2的幂次方表示(C++)

b.非递归:使用了两个while循环语句,首先定义了一个长度为100的字符数组,当n非零时,有a[i]=n%b; 将计算得到的余数保存在数组中;然后i++;进行下一次运算,n/=b;将计算得到的除法结果作为新的数进行进制转换。如此不断重复,直到n=0时结束循环。然后当i>0时,有c=a[--i]; 将结果倒序输出,得到最终结果。

 B.题目2

a.递归:首先在while循环中用pow(2,x)函数计算出结果大于n时最大的x的值,然后退出循环后x需要自减1,若x=0,则输出2(0);若x=1,则输出2;其余情况均输出2(x);然后判断n-(n-pow(2,x))是否大于0,若大于0,这说明还能继续分解,继续调用print(n)函数,继续进行判断并输出。

十进制转化为b进制,2的幂次方表示(C++)

 

  • 算法构造
  1. 题目1
  1. 递归流程图

十进制转化为b进制,2的幂次方表示(C++)

 

 

b.非递归流程图

十进制转化为b进制,2的幂次方表示(C++)

2.题目2

递归流程图

十进制转化为b进制,2的幂次方表示(C++)

三、调试、测试及运行结果

(1)调试

1.输入n=15,b=16,观察递归过程变量值的变化。

十进制转化为b进制,2的幂次方表示(C++)

2.发现经过n/=b后,n=0,b=16.

十进制转化为b进制,2的幂次方表示(C++)

3.m=15.

十进制转化为b进制,2的幂次方表示(C++)

4.通过上述几步,递归调用的结果为f。

十进制转化为b进制,2的幂次方表示(C++)

B.题目2递归

1.输入137,最初x=0

十进制转化为b进制,2的幂次方表示(C++)

2.x++后x=1

十进制转化为b进制,2的幂次方表示(C++)

3.x一直自加,一直到x=8

十进制转化为b进制,2的幂次方表示(C++)

4.发现x=9时,pow(2,9)>137,所以8是最大的x的值,

十进制转化为b进制,2的幂次方表示(C++)

 

十进制转化为b进制,2的幂次方表示(C++)

 

十进制转化为b进制,2的幂次方表示(C++)

 

十进制转化为b进制,2的幂次方表示(C++)

(2)测试结果

A.递归

a.测试代码

十进制转化为b进制,2的幂次方表示(C++)

b.测试截图

十进制转化为b进制,2的幂次方表示(C++)

B.非递归

a.测试代码

十进制转化为b进制,2的幂次方表示(C++)

b.测试截图

十进制转化为b进制,2的幂次方表示(C++)

(3)运行结果

1.题目1

A.用递归方法求解:

十进制转化为b进制,2的幂次方表示(C++)

B.用非递归方法求解:

十进制转化为b进制,2的幂次方表示(C++)

2.题目二

A.用递归方法求解

十进制转化为b进制,2的幂次方表示(C++)

四、经验归纳

此次作业在上机实验的基础上,又进一步加深了对递归的理解。但是,实践总是会出现这样那样的问题~~~如下是这次做作业过程中出现的几个问题。

1.在题目1中,应该先对n取余,再进行除法运算。起初由于把n/=b语句写在了a[i]=n%b;i++;语句前面,导致了运算结果不正确。错误结果截图如下图1所示。

十进制转化为b进制,2的幂次方表示(C++)

                                         图1.运算顺序不正确运行生成的错误结果截图

2.在题目1中,若余数大于10,需要转化为相应的字母,起初未对它进行强制类型转换,导致输出结果错误。错误结果截图如下图2所示。

十进制转化为b进制,2的幂次方表示(C++)

                                       图2.未进行强制类型转换运行生成的错误结果截图

3.在题目2中,用到了pow(n,b)函数,用来求n得b次幂。并且要特别注意,用此函数时,需要加上头文件#include<cmath>。

十进制转化为b进制,2的幂次方表示(C++)

4.在最初设计递归模型时,往往没有思路,经过练习后,我发现最重要的首先要找到递归出口,写出递归的模型体,再补充递归函数体,就相对比较简单了。因此设计递归模型时,必须要对题目清晰的理解,掌握其总体思路,进而才能成功设计出递归模型。

 

参考博客链接:https://blog.****.net/qq_41932111/article/details/88379554