五隻猴子一起摘了一堆桃子,因爲太累了,它們商量決定,先睡一覺再分.一會其中的一隻猴子來了,它見別的猴子沒來,便將這堆桃子平均分成5份,結果多了一個,就將多的這個吃了,並拿走其中的一份.一會兒,第2只猴子來了,他不知道已經有一個同伴來過,還以爲自己是第一個到的呢,於是將地上的桃子堆起來,再一次平均分成5份,發現也多了一個,同樣吃了這1個,並拿走其中一份.接着來的第3,第4,第5只猴子都是這樣做的.......,根據上面的條件,問這5只猴子至少摘了多少個桃子?第5只猴子走後還剩下多少個桃子?
看到這個練習題後,如果從前面往後面推,則很難。甚至能把你的思路弄的特別混亂,如果從往前推,我們可以列出如下數學式子。假設第五隻猴子走後剩下x個桃子。即s6=x;假設第五隻猴子沒有分桃子之前的桃子數爲s5。因爲第五隻猴子看到這堆桃子後,分了5份,發現多了一個把多餘的一個吃了,拿走了其中的一份。我們可以這樣理解,猴子吃了一個桃子,然後分了五份,自己拿走了一份。剩下的桃子個數爲s6;因此我們可以很快的列出下面的一個數學式子:
(s5 - 1)/5*4 = s6; A
因此是一個迭代的過程,因此。我們可以一直往上推,即可推出下面的式子。
(s4 - 1)/5*4 = s5; A
(s3 - 1)/5*4 = s4; A
(s2 - 1)/5*4 = s3; A
(s1 - 1)/5*4 = s2; A
將上面的式子進行變化,我們很快可以可以得到下面的式子。
s6=x;
s5=s6*5/4+1; B
s4=s5*5/4+1; B
s3=s4*5/4+1; B
s2=s3*5/4+1; B
s1=s2*5/4+1; B
從上面的式子,我們可以看到從s6到s1是一個迭代求解的過程。其迭代的表達式爲:
s=x
s=s*5/4+1
s=s*5/4+1
s=s*5/4+1
s=s*5/4+1
s=s*5/4+1
另外從上面標有 A 的表達式,進行簡單等式變化:
s6 = x;
(s5-1)/5 = s6/4;
(s4-1)/5 = s5/4;
(s3-1)/5 = s4/4;
(s2-1)/5 = s3/4;
(s1-1)/5 = s2/4;
從上面的式子,我們可以很快的推理出s2,s3,s4,s5,s6都是4的倍數。當然了s1不一定是4的倍數。因爲我們求解桃子的總個數是個未知數,從上面的分析可知桃子的個數是4的倍數,這樣很容易讓我們想到進行循環,初始值爲0,每次循環,如果不是需要的數,就加上4。而跳出循環的判斷條件即,進行5次分桃子都能成功(進行紅色B運算),即可跳出循環。
代碼如下:
#include <stdio.h>
int main(int argc,int *argv[]) { int i,j,number = 0,all; do { all = number; for (i = 1; i <= 5; i++) { all = all * 5 / 4 + 1; if (all % 4 ) { break; } } if (i == 5) { break; } number += 4; } while (1); printf("all taozi count is : %d, the lost taozi count is :%d/n",all,number); system("pause"); return 0; }
|
程序運行結果:猴子一共摘了3121個桃子,第5只猴子走後還剩下1020個桃子。