问题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又均匀 分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
剖析:采取递归算法。设桃子总数为N,则
第一个猴子拿走的是M1=(N-1)/5;
第二个猴子拿走的是M2= (M1-1)/ 5 ;
第三个猴子拿走的是M3= (M2-1)/ 5 ;
依此类推,第n个猴子拿走的桃子是
M(n) = (M(n-1)-1)/5;
软件实现:
#include <stdio.h>
int nCounter = 0;
int f(int nNum)
{
int nTmp = nNum - 1;
if((0 == (nTmp%5)) && (nCounter < 5 ))
{
nCounter ++ ;
return f(nTmp/54);
}
else
return nNum;
}
int main(int argc,char argv[])
{
for(int i=1;;i++)
{
if((i-1)%5==0) //代码优化
{
nCounter = 0;
if( f(i)!=-1 && nCounter==5)
{
printf(\"大众统共有 %d 个桃子\n\"大众,i);
break;
}
}
}
return 0;
}
VC6.0下编译输出:
~~~end~~~