1、捕鱼&分鱼
A,B,C,D,E五个人捕鱼后已凌晨,大家便睡觉。早上A第一个醒来,将鱼均分成五份,把多余的一条鱼扔掉,拿走自己的一份,B第二个醒来,也将鱼均分为五份,把多余的一条鱼扔掉,拿走自己的一份。CDE依次醒来,也按同样的方法拿鱼,问他们合伙至少捕了几条鱼。
方法一:
推理过程:
用Sum表示原有的鱼的总数,那么根据题目意思,(Sum+4)%5 == 0。现在考虑这样的情景:
总共有Sum+4条鱼,A拿鱼的时候刚好能够均分,拿走自己的鱼后(比原来多拿了一条),剩下的鱼比原来情况(总共Sum条鱼)下多4条,因此B拿鱼的时候也能均分,B拿到比原来多一条,而且剩下的鱼又比原来情况下多4条,如此下去刚好每次都多4条鱼,刚好都能均分。
在鱼的总数为Sum+4的情况下,用remain表示E拿走属于自己的鱼之后,剩下的鱼的数目,那么
E在拿鱼之前,鱼的数目为:remain*5/4
D在拿鱼之前,鱼的数目为:remain*(5/4)^2
C在拿鱼之前,鱼的数目为:remain*(5/4)^3
B在拿鱼之前,鱼的数目为:remain*(5/4)^4
A在拿鱼之前,鱼的数目为:remain*(5/4)^5即为鱼的总数Sum+4
所以Sum+4 = remain*(5/4)^5 =remain*3125/1024.
等式右边必须取整数,所以remain = 1024,Sum = 3125 - 4 = 3121
方法二:
正规的程序迭代验算方法
假设鱼的总数为x,那么(x-1)%5==0;B拿鱼的时候,鱼的数目为4*(x-1)/5,此时有(4*(x-1)/5 - 1 )%5==0
如此进行下去,对每个数逐次验证,如果满足要求,则表示找到了结果。
int fish(int num)
{
int t_result = 0;
int i = num;
while( i++ )
{
t_result = i;
bool find = true;
for( int j = 0; j < num; j++ )
{
if((t_result-1)%5==0)
t_result = (t_result-1)*4/5;
else
{
find = false;
break;
}
}
if( find )
break;
}
t_result = i ;
cout << t_result << endl;
return t_result;
}