半數集問題

2021-07-23 21:29:34 字數 967 閱讀 3947

問題描述:

給定乙個自然數n,由n 開始可以依次產生半數集set(n)中的數如下。

(1) n∈set(n);

(2) 在n 的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半;

(3) 按此規則進行處理,直到不能再新增自然數為止。

例如,set(6)=。半數集set(6)中有6 個元素。

注意半數集是多重集。

分析:遞迴法不需多說,只是簡單地將每次的半數集累加起來,因為半數集最少也是元素個數本身,所以sum = 1;因為左面的數不能超過本數的一半,所以有乙個迴圈語句:for(int i=1;i<=n/2;i++)   ,然後進行累加:sum=sum+f(i)。

技巧法是採用這個問題的一些規律:f(n) = f(n/2 * 2 - 1) + f(n/2);比如:f(6) =f(6/2 *2 -1) + f(6/2) = f(5) + f(3) = 4+2=6;f(7) = f(7/2 * 2 - 1) + f(7/2) = f(5) + f(3) = 4 + 2 = 6;或許你會納悶,為什麼要 n/2 * 2呢?因為n是int型的,n/2也是int型的,所以不論n是偶數或者奇數,都會向下取整,按照偶數來算。具體說的可能不太清晰,你可以代入幾個數試一試,沒有你想象的那麼複雜......

遞迴法(普通):

#includeint f(int n)

return sum;

}int main()

技巧法(規律):

#include#define n 1000

int asd[n];

int main()

int n = 0;

printf("請輸入乙個自然數:");

scanf("%d",&n);

printf("其半數集的元素個數為%d個\n",asd[n]);

return 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 個元素。注意半數集是多重集。程式設計任務 ...