迭代算法-計算猴子一共摘了多少個桃子

    迭代練習題:

    五隻猴子一起摘了一堆桃子,因爲太累了,它們商量決定,先睡一覺再分.一會其中的一隻猴子來了,它見別的猴子沒來,便將這堆桃子平均分成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個桃子。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章