题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。
第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。
第 2 只猴子醒来,把香蕉均分成 5 堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。
第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。
第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。
第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!
请计算一开始最少有多少个香蕉。
问题分析
这道题我们采用逆向思维来做,假设最后一次分堆分成的一堆为1个,如果运算中间的数据不符合就分成一堆2个以此类推,根据题干我们可以总结出显而易见的规律,除了最后一只猴子外,第i只猴子吃掉了i个香蕉,同时藏起了吃掉后的香蕉数量的1/5,所以我们先将1/5补全,再加上i个香蕉就是到第i只猴子手中的香蕉数目,以此类推至第一只猴子,我们就能直到一共有多少个香蕉,因为我们逆推时原始一堆的香蕉个数是从少到多,在第一次计算出符合要求的数据后我们就结束了,所以能够得到正确的数据。
代码实现
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int flag=0;
double x;
for(int m=1;flag==0;m++){//逆向推理第一步,找出最后一只猴子分出的香蕉数目
x=(double)m;//转换成double类型,便于后面判断该数据是否合理
for(int i=5;i>=1;i--){
if(i!=5){
if(x/4==(int)x/4){//第5只猴子之外的猴子都将香蕉数目变成吃掉后的4/5,所以我们要判断这一步中的x值是否合理
x=x*5/4;
x+=i;
flag=1;
}else{//不合理
flag=0;
break;
}
}else{
x*=5;
}
}
}
printf("%.0lf",x);//打印数目
return 0;
}