(数论)数的计算
我們要求找出具有下列性質(zhì)數(shù)的個(gè)數(shù)(包含輸入的自然數(shù)n):
先輸入一個(gè)自然數(shù)n(n<=1000),然后對(duì)此自然數(shù)按照如下方法進(jìn)行處理:
1.??????????不作任何處理;
2.??????????在它的左邊加上一個(gè)自然數(shù),但該自然數(shù)不能超過(guò)原數(shù)的一半;
3.??????????加上數(shù)后,繼續(xù)按此規(guī)則進(jìn)行處理,直到不能再加自然數(shù)為止.
輸入描述?Input Description一個(gè)數(shù)n
輸出描述?Output Description滿足條件的數(shù)的個(gè)數(shù)
樣例輸入?Sample Input6
樣例輸出?Sample Output6
數(shù)據(jù)范圍及提示?Data Size & Hint6個(gè)數(shù)分別是:
6
16
26
126
36
136
分析:
? ? 1. 本題難度看似不大,但如果用遞歸來(lái)做的話耗時(shí)非常大,因?yàn)樾枰貜?fù)計(jì)算的數(shù)據(jù)量太大了。當(dāng)然我們也可以采取一邊遞歸一邊儲(chǔ)存的方法,但計(jì)算量也還是不小,再進(jìn)一步思考,實(shí)際上就是可以用如下的遞推法來(lái)做;
??? 2. 例如要求f(6),經(jīng)過(guò)分析,我們知道:f(6)=f(1)+f(2)+f(3)+1,也就是說(shuō),f(6)的答案數(shù)量是在它之前可以取的所有自然數(shù)的答案數(shù)量之和(6之前可以取1,2,3三個(gè)自然數(shù)),最后加1是指數(shù)字6本身也是一個(gè)答案;
??? 3. 所以,我們可以知道f(n)=f(1)+f(2)+......f(trunc(n/2))+1;
??? 4. 因此,要求f(n),我們只需用上述公式編一個(gè)遞推過(guò)程,把f(2)到f(n)全部求出即可,對(duì)于f(1000)也不超過(guò)1秒就能得到結(jié)果。
??? 第二種算法:
??? 1. 對(duì)于f(7)=f(6)是顯而易見(jiàn)的,也即f(2n+1)=f(2n)。那么,f(8)和f(7)之間有什么關(guān)系呢?
??? 2. 分析可知:f(8)和f(7)的差別是,f(8)除了包含f(7)的所有情況外,還要多加上f(4),即:f(8)=f(7)+f(4)。因此可得:f(2n)=f(2n-1)+f(n)。只需據(jù)此編一個(gè)遞歸小過(guò)程或者用遞推方法即可。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ganhang-acm/p/4167513.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: [编译原理学习]词法分析
- 下一篇: jcDate时间选取jQuery插件