猴子分桃问题的几种解法

五只猴子采得一堆桃子,半夜里第一只猴子偷偷起来把桃平均分成五分,发现还多一个,它吃了哪个桃子,还拿走其中的一份,第二只猴子起来又把桃子分成五分,还多一个,它吃了那个桃子,有拿走其中的一份,第三第四第五只猴子都如此做了,请问这堆桃子有多少个。

(新人)

在参考了一些经典解法、研究了该问题的过程后,以下为一些自认为较为简洁明白的解法程序

1.利用总式子为整数,进行枚举循环。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	double a=2;
	int i,j,k;
	for (i = 0; i < 3200; i++)         //这里估计了一下大致范围
	{
		for (j = 0; j < 5; j++)               //含义是对a进行题述处理,中间过程及结果必须是整数,以此为标准来判断
		{
			k = 0;
			a = 0.8*(a - 1);
			if ((a -(int)a)!=0 )     //判断整数
				break;
			k = 1;
		}
		if (k==1)
			break;
		a=3+i;
	}
	a = 2 + i;                        //注意,如果直接输出,结果是第五只猴子分后剩余的数量,同时,i已经多了1
	printf("桃子数量为%.01lf", a);   //double 一般对应lf
	return 0;
}

当然,虽然个人认为这种较好理解,但总感觉结构比较拖沓。只是一种方向初步的想法,仅仅参考,并不是较为泛用的方法

2. 4 的倍数

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int  i=0,x, t;
	for(x=4; i < 5;x=x+4)
	{		
		t=x;       //要注意此处容易漏掉,必须有交换,否则x=x+4中的x是进行迭代过后的x!!
		for (i = 0; i < 5; i++)
		{
			if (t % 4 != 0)
				break;
			t = (t / 4) * 5 + 1; 
		}
	}
	printf("%d", t);
	return 0;
}

最根本的依据确实很像:都是依据每次分桃后必为4的倍数,但处理过程有所不同。

想借此拓展一些附加功能,比如输出每次的执行结果,整理成表,探究不同形式的循环设置,再看看书中对于循环的讲解,拓宽应用的思路

3.看知乎还有人直接给了通项公式

还不会latex,直接打出来是y=n^n-n+1,n是猴子个数

猜你喜欢

转载自blog.csdn.net/m0_62167955/article/details/121056801