【C++】将非负十进制整数n转换成b进制以及用2的幂次方表示正整数递归+非递归+递归树

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

本文结构:

一、题目描述 题目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.运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值