猴子分桃子

原文

题目如下:

五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;......其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?


这完全是一个数学问题。

假设这堆桃最初有X个。由第一个猴子吃掉一个,拿走一堆,可知X模5得1,即X=5*a+1.,第一个猴子走后剩下4a个桃子。

由第二个猴子吃掉一个,拿走一堆,可知4a模5得1,即4a=5*i+1,其中i>=0,解这个方程,

4a=5i+1,i>=0,由于a和i都是整数,那么i一定为奇数,否则5i+1为奇数,4a为偶数,左边不等于右边。设i=2*j+1,j>=0,则4a=10*j+6.即2a=5j+3,j一定为奇数,设j=2b+1,b>=0,则有2a=10b+8,即a=5b+4,b>=0。

可得a=5*b+4,其中b>=0,剩下16b+12个桃子。

由第三个猴子吃掉一个,拿走一堆,可知16b+12模5得1,即16b+12=5*j+1,其中j>=0,解这个方程可得b=5*c+4,其中c>=0,依次类推。

第四个猴子,得到c=5*d+4,d>=0;第五个猴子,得到d=5*e+4,e>=0。

由上得到a=5a+1=25b+21=125c+121=625d+621=3125e+3121, e>=0。

因此这堆桃至少有3121个。


假如有N个猴子,那么计算最少的桃子数目程序如下:

  1. int i=1;  
  2. int sum=0;  
  3. while(i<N)  
  4. {  
  5.     sum=5*sum+4;i++;  
  6. //循环N-1次  
  7. sum=5*sum+1; //再综合一下  

此时的sum即为最少的桃子数目。

猜你喜欢

转载自depravedangel.iteye.com/blog/1183684