問題描述:
給定乙個自然數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 個元素。注意半數集是多重集。程式設計任務 ...