一、題目部分
題目描述
我們要求找出具有下列性質數的個數(包含輸入的自然數n):
先輸入乙個自然數n(n≤1000),然後對此自然數按照如下方法進行處理:
1.不作任何處理;
2.在它的左邊加上乙個自然數,但該自然數不能超過原數的一半;
3.加上數後,繼續按此規則進行處理,直到不能再加自然數為止.
輸入格式
1個自然數n(n≤1000)
輸出格式
1個整數,表示具有該性質數的個數。
輸入輸出樣例
輸入 #1
6輸出 #1
6二、解題過程
思路
(1)輸入乙個自然數
(2)通過迴圈求小於該自然數的所有自然數對應的性質數
(3)加上本身的對應的單個性質數
(4)輸出最終結果
原來的超時做法
#include
using
namespace std;
intadd
(int n)
return cnt;
}int
main()
提交ac答案
#include
using
namespace std;
int n,a[
1001];
intmain()
//迴圈求值 逐步遞推相加
else
a[i]++;
//加上自己本身
}printf
("%d"
,a[n]);
}return0;
}
三、小結
(1)「在原數的左邊加上乙個自然數,但該自然數不能超過原數的一半」對這句話的理解很重要,有助於通過對較小的自然數的列舉更快地得出相鄰自然數之間的遞推關係。
例:a[0]=1;//這裡算出的1指原數本身
a[1]=1;
a[2]=a[1]+1;
a[3]=a[1]+1;
a[4]=a[2]+a[1]+1;
a[5]=a[2]+a[1]+1;
a[6]=a[3]+a[2]+a[1]+1;
等等…(2)這題用遞迴去做固然方便,卻很容易超時,而為了避免超時,需要採用遞推。通俗地解釋,遞迴的計算大概是指f(n)->f(n-1)…f(1)->f(0)->f(1)->…->f(n-1)->f(n)這樣乙個過程,而遞推是指f(0)->f(1)->…->f(n-1)->f(n)這樣乙個過程,顯然遞推的運算效率要高於遞推。
參考鏈結遞迴與遞推的區別
P1028 數的計算
我們要求找出具有下列性質數的個數 包含輸入的自然數 nn 先輸入乙個自然數 nn n le 1000n 1000 然後對此自然數按照如下方法進行處理 不作任何處理 在它的左邊加上乙個自然數,但該自然數不能超過原數的一半 加上數後,繼續按此規則進行處理,直到不能再加自然數為止.輸入格式 11 個自然數...
P1028 數的計算
我們要求找出具有下列性質數的個數 包含輸入的自然數nn 先輸入乙個自然數nn n le 1000n 1000 然後對此自然數按照如下方法進行處理 不作任何處理 在它的左邊加上乙個自然數,但該自然數不能超過原數的一半 加上數後,繼續按此規則進行處理,直到不能再加自然數為止.輸入格式 11個自然數nn ...
P1028 數的計算
我們要求找出具有下列性質數的個數 包含輸入的自然數n 先輸入乙個自然數n n 1000 然後對此自然數按照如下方法進行處理 不作任何處理 在它的左邊加上乙個自然數,但該自然數不能超過原數的一半 加上數後,繼續按此規則進行處理,直到不能再加自然數為止.1個自然數n n 1000 1個整數,表示具有該性...