本文结构:
一、题目描述 题目1 题目2
二、解题相关
题目一:1.递归解题代码(解释见代码) 2.非递归解题代码(解释见代码) 3.递归树 4.递归模型 5.运行结果截图
题目二:1.递归解题代码(解释见代码) 2.递归树 3.递归模型 4.运行结果截图
一、题目描述
题目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表示(在表示中不能有空格)
样例输入
73
样例输出
2(2(2)+2)+2(2+2(0))+2(0)
二、解题相关
【题目1】
1.递归(解释见代码)
/*
@Author:Innocence
@OS:win10
@IDE:dev C++
@Time:2019/6/4
@Edition:1.0
@Description:利用了栈模拟用笔计算进制转化的过程
*/
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//递归实现 定义了一个stack容器,里面存放char类型的值
void TransRes(stack<char>& s,int n,int base)
{
char digit[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
if (n>0)
{
s.push(digit[n%base]); //将转换后的数压入栈
TransRes(s,n/base,base);
}
}
int main()
{
stack<char> s;
int num=0; // 十进制
int sys=0; // 要转换的进制
cout << "请输入要转换的数字和进制:" << endl;
cin >> num >> sys;
TransRes(s,num,sys); // 调用递归方式转换
cout << num << "转换成" << sys << "进制的结果是:" <<endl;
while(!s.empty()) // 栈不为空
{
cout<<s.top(); // 输入栈顶,对应笔算后结果的从下向上输出
s.pop(); // 这个数字出栈
}
return 0;
}
2.非递归(解释见代码)
/*
@Author:Innocence
@OS:win10
@IDE:dev C++
@Time:2019/6/4
@Edition:1.0
@Description:利用了栈模拟用笔计算进制转化的过程
*/
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//非递归实现 定义了一个stack容器,里面存放char类型的值
void TransIteration(stack<char>& s,int n,int base)
{
char digit[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while (n>0) //n不为0时
{
int i=int(n%base); //计算出n%base
s.push(digit[i]);
n/=base;
}
}
int main()
{
stack<char> s;
int num=0; // 十进制
int sys=0; // 转换后的进制
cout << "请输入要转换的数字和进制:" << endl;
cin >> num >> sys;
TransIteration(s,num,sys); // 调用非递归方式转换
cout << num << "转换成" << sys << "进制的结果是:" <<endl;
while(!s.empty()) // 栈不为空
{
cout<<s.top(); // 输出栈顶 入栈顶,对应笔算后结果的从下向上输出
s.pop(); // 出栈
}
cout << endl;
return 0;
}
3.递归树
以将12转化成4进制数的过程为例:

4.递归模型
【模板】
递归函数(){ 1、递归的出口; 2、递归调用 3、递归的本级处 }
【此题的递归模型】
递归函数:void TransRes(stack<char>& s,int n,int base) { 1.递归的出口:n<=0 2.递归调用、递归的本级处 TransRes(s,n/base,base); }
5.运行结果

【题目2】
1.递归(解释见代码)
#include <iostream>
using namespace std;
void fun(int n)
{
if (1==n) // n=1的时候直接输出
{
cout << "2(0)";
return ;
}
if(2==n) // n=2的时候直接输出
{
cout << "2";
return ;
}
int p=1; // 最接近n的2的幂
int s=0; // 此时p的幂次方
while (p<=n) // 最接近n的2的幂
{
p=p*2;
s++;
}
s=s-1; // 如果二者相等就多算了一次
if(n==p/2) // 如果二者相等p就多乘了一次二,这种情况下n=p/2,进入分解p的过程
{
cout << "2(";
fun(s); // 继续分解p
cout << ")";
}
else // 两者不等的情况
{
if(2==(p/2)) // p/2=2,且因为二者不等,那么n一定为奇数,所以还要继续递归n中减去p/2的数
{
cout << "2+";
fun(n-p/2);
}
else // p/2为2以外的其他偶数,则一定可以分解成2乘以某个数。所以再把p的幂次方分解
{
cout << "2(";
fun(s);
cout << ")+"; // 分解完p的幂次方了
fun(n-p/2); // 继续分解n中减去p的数
}
}
}
int main()
{
int n;
cout << "请输入一个正整数:" << endl;
cin >> n;
cout << "分解结果为:" << endl;
fun(n);
return 0;
}
2.递归树

3.递归模型
【模板】
递归函数(){ 1、递归的出口; 2、递归调用 3、递归的本级处 }
【此题的递归模型】
递归函数:void fun(int n){ 1.递归的出口:n==1||n==2 2.递归调用、递归的本级处 fun(n) }
4.运行结果

本文介绍了如何使用C++进行非负十进制整数到b进制的转换,包括递归和非递归方法,并展示了递归树和递归模型。同时,探讨了正整数用2的幂次方表示的方法,提供了解题代码和运行结果。

5233

被折叠的 条评论
为什么被折叠?



