【C++】將非負十進制整數n轉換成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.運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章