猴子分桃

1、五隻猴子分桃。半夜,第一隻猴子先起來,它把桃分成了相等的五堆,多出一隻。於是,它吃掉了一個,拿走了一堆; 第二隻猴子起來一看,只有四堆桃。於是把四堆合在一起,分成相等的五堆,又多出一個。於是,它也吃掉了一個,拿走了一堆;.....其他幾隻猴子也都是 這樣分的。問:這堆桃至少有多少個?(朋友說,這是小學奧數題)。
  參考答案:先給這堆桃子加上4個,設此時共有X個桃子,最後剩下a個桃子.這樣: 
  第一隻猴子分完後還剩:(1-1/5)X=(4/5)X; 
  第二隻猴子分完後還剩:(1-1/5)2X;
  第三隻猴子分完後還剩:(1-1/5)3X;
  第四隻猴子分完後還剩:(1-1/5)4X;
  第五隻猴子分完後還剩:(1-1/5)5X=(1024/3125)X;
  得:a=(1024/3125)X;
  要使a爲整數,X最小取3125.
  減去加上的4個,所以,這堆桃子最少有3121個。
或者
1、5只猴子分一堆桃子,怎麼也不能分成5等份,只好先去睡覺,準備第二天再分。夜裏1只猴子偷偷爬起來,先吃掉1個桃子,然後將其分成5等份,藏起自己的一份就去睡覺了;第2只猴子又爬起來,吃掉1個桃子後,也將桃子分成5等分,藏起自己的一份睡覺去了;以後的3只猴子都先後照此辦理。問最初至少有多少個桃子?

倒過來想問題:

要假設第五隻猴子時,平均每個猴子得到n個桃子
第五隻猴子吃掉一個桃子後剩5n個 
第四隻猴子吃掉一個桃子後剩5(5n+1)/4=25n/4+5/4 
第三隻猴子吃掉一個桃子後剩5(25n/4+5/4+1)/4=125n/16+45/16 
第二隻猴子吃掉一個桃子後剩5(125n/16+45/16+1)/4=625n/64+305/64 
第一隻猴子吃掉一個桃子後剩5(625n/64+305/64+1)/4=3125n/256+1845/256 
原來共有桃子3125n/256+1845/256+1=3125n/256+2101/256=(12n+8)+53(n+1)/256 
這裏是突破口:53(n+1)/256 是整數
桃子數是整數 所以n=255 桃子總數3121個。

C++代碼實現,使用遞歸算法:

  1. int count = 0;  
  2. int func(int num)  
  3. {  
  4.     int temp = num-1;  
  5.     if(temp%5 == 0 && count<5)  
  6.     {  
  7.         count++;   
  8.         return func(temp/5*4);  
  9.   
  10.     }  
  11.     else  
  12.         return num;  
  13. }  
  14.   
  15. int main(void)  
  16. {  
  17.     int i;  
  18.     for(i = 1;i<40000;i++)  
  19.     {  
  20.         if((i-1)%5==0)         //代碼優化  
  21.         {  
  22.             count = 0;  
  23.             if( func(i)!=-1 && count==5)  
  24.             {   
  25.                 cout<<"總共有: "<<i<<"個桃子"<<endl;  
  26.                 break;  
  27.             }  
  28.         }  
  29.     }  
  30.     system("pause");  
  31.     return 0;  
  32. }  
發佈了434 篇原創文章 · 獲贊 93 · 訪問量 154萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章