逻辑推理相关问题集锦


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;
}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值