本文結構:
一、題目描述 題目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.運行結果