五只猴子分桃。第1只猴子把这堆桃子凭据分为五份, 多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只到第五只猴子都如此分,五轮后,原来桃子总共有多少个

博客探讨了一种猴子分桃问题的解决思路,通过逆向思维和循环验证,寻找桃子初始数量。文章详细解释了如何从最后一轮分配开始,逐轮回溯计算桃子的初始总数,确保在五轮分配后,桃子能被均匀分完。核心算法涉及分配比例和循环条件判断,旨在找出满足条件的最小桃子数。
/*
	思路:
	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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值