/*
思路:
1.根据提议,我们得到的信息有 桃子分配方式 分配的轮数
2.把得到的信息关联起来
假设最后一轮猴子分完桃子后,他本身得到1个桃子
计算得到最后一轮猴子分配时桃子的数量=6
每次分配的桃子数量是上一次分配后留下的4/5,得到上一次分配后剩余桃子数量6,然而6是无法整除4的,所以当前假设最后一轮猴子得到的桃子数量不对\
需要更新假设猴子得到桃子的数量
3.根据题意是进行了五次分配,所以我们需要逆推五次,满足五次条件,则找到桃子数量
4.不知假设的值到底是几合适,所以用死循环来查找
难点:概念
上一轮分配的桃子总数==这一次分配的总数/4*5+1;
这一次分配的桃子总数==(上一轮分配的桃子总数-1)/5*4
假设倒数第二轮分配后,猴子得到的桃子数量,从而得到最后一次分配桃子的总数
*/
int i = 0; //循环变量,用于标记是第几次分配
int x = 0; //表示倒数第二轮分配后剩余的数量(作为最后一轮分配的总数量)
int j = 1; //加入最后一轮分配完,猴子得到的数量
while (1)//假设最后一轮猴子得到的桃子个数不一定正确,需要不断验证来修正
{
//假设倒数第二轮分配后猴子得到一个桃子,得到上一轮分配后剩余的桃子数量,也是是这次桃子分配的总数
x = j*4;//得到最后一轮分配的桃子总数
for (i=0; i < 5;)//分配了五轮,就需要你逆推五轮,如果连续五次推论都正确,则表示满足条件,找到最小需要的桃子数
{
if (x % 4 != 0)break;//当前分配是用上一轮分配后的剩余的4/5份,如果你退的数量%4不等于0,这表示无法平均分四份,\
则退出五轮逆推,更新最后假设猴子得到的桃子数量
x = (x / 4) * 5 + 1;//得到当前需要分配的桃子总数,也就是得到上一轮分配过后剩余的桃子树
i++;
}
j++;//更新假设最后一论猴子得到的数量
if (i == 5)//如果i==5,表示逆推五轮的数量都成立,退出循环得
{
break;
}
}
std::cout << x << std::endl;
五只猴子分桃。第1只猴子把这堆桃子凭据分为五份, 多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只到第五只猴子都如此分,五轮后,原来桃子总共有多少个
最新推荐文章于 2025-09-06 09:26:50 发布
