問題描述:給定乙個自然數n,由n開始可以依次產生半數集set(n)中的數如下:
(1) n∈set(n);
(2) 在n的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半;
(3) 按此規則進行處理,直到不能再新增自然數為止。
例如,set(6)=,半數集set(6)中有6個元素。
輸入:整數n(0舉例子弄清楚題意
「(2) 在n的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半;」
這句話的意思是直接在n的左邊寫乙個數 但是不能超過n/2;
比如:set(8)=
可以在其左邊新增的最大數為8/2=4,所以新增的最大數就是48. 當新增了48後 因為基礎數為n=8
那麼4 8 的一半分別是 2 4 ,然後加在左邊變成 248。同理 2 4 8 的一半是1 2 4,但是最近新增的數是248,因為「(3) 按此規則進行處理,直到不能再新增自然數為止」,所以2 4不滿足定義,只新增1,則最後乙個數為1248.
遞迴**(效率較低)
#include
using
namespace std;
intset
(int i)
else
return1;
}void
main()
動態規劃(效率較高)
#include
using
namespace std;
#define n 1001
int asd[n]
;void
main()
cout<<
"--"
while
(n >=0)
}
半數集和半數單集問題
問題描述 給定乙個自然數n,由n 開始可以依次產生半數集set n 中的數如下。1 n set n 2 在n 的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半 3 按此規則進行處理,直到不能再新增自然數為止。例如,set 6 半數集set 6 中有6 個元素。注意半數集是多重集。演算法設計...
半數集與半數單集問題
給定乙個自然數n,由n 開始可以依次產生半數集set n 中的數如下。1 n set n 2 在n 的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半 3 按此規則進行處理,直到不能再新增自然數為止。例如,set 6 半數集set 6 中有6 個元素。include include incl...
半數集問題
問題描述 給定乙個自然數n,由n開始可以依次產生半數集set n 中的數如下。1 n set n 2 在n的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半 3 按此規則進行處理,直到不能再新增自然數為止。例如,set 6 半數集set 6 中有6 個元素。注意半數集是多重集。程式設計任務 ...