/*海滩上有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,
拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,
拿走了一份,
第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子?(3121)
思路
设最开始桃子个数为x
第一只猴子分到的桃子数为(x-1)/ 5,分完之后还剩x1 =(x-1)- (x-1)/ 5 = (4/5)*(x-1)
第二只猴子分到的桃子数为(x1-1)/ 5,分完之后还剩x2 =(x1-1)- (x1-1)/ 5 = (4/5)*(x1-1)
同理可得:
第五只猴子分到的桃子数为(x4-1)/ 5,分完之后还剩x5 =(x4-1)- (x4-1)/ 5 = (4/5)*(x4-1)
其中:假如设第五只猴子分到手t 个桃子,那么有x4 = t * (5/4)+1 ,
说明,每一次分完之后剩下的桃子都要能够被 4 整除
3121
3121-1 / 5 * 4 = 2496
2496 -1 /5 *4 = 1996
1996 -1 / 5 *4 = 1596
1596 -1 / 5*4 = 1276
(1276 - 1)/ 5*4 = 1020
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 1;//第几只猴子
int peach = 1;//桃子数量
int count = 1; // 因为每次分桃的数量会更新,所以必须额外声明一个变量来不断递增做实验
while (i <= 5) //当成功执行五次就说明成功了
{
if (peach % 5 == 1)
{
peach = (peach - 1) / 5 * 4;//peach在这里会变化 所以不能用peach++
i++;
}
else
{
// 每循环一次peach的数量就加一次,然后再进行尝试判断,为了避免peach在if代码块里变化过,所以额外的一个变量来做更新
count++;
peach = count;
i = 1; // 为了避免循环条件变量i也被更新过,所以只要有一次判断不成功就重新来过,重新设为初始值
}
}
printf("最后的桃子数量%d\n", peach);
for (int i = 0; i < 5; i++)
{
peach = peach * 5 / 4 + 1;
}
printf("原来最少有%d个桃子\n", peach);
return 0;
}