逻辑推理

  1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
    A选手说:B第一,我第三。
    B选手说:我第二,E第四。
    C选手说:我第一,D第二。
    D选手说:C最后,我第三。
    E选手说:我第四,A第一。
    比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

    首先我们看到这道题,要仔细看题,因为我们惯性思维认为确定名次,名次就是12345名,但是仔细看题上D说C最后,而不是C第五或第四,如果C第四的话也就说明名次中有并列的。
    那样我们用这一串代码求出来的就是很多结果的

#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    for(a=1;a<=5;a++)
    {
        for(b=1;b<=5;b++)
        {
            for(c=1;c<=5;c++)
            {

                for(d=1;d<=5;d++)
                {
                    for(e=1;e<=5;e++)
                    {
                        if((b==1)+(a==3)==1&&(b==2)+(e==4)==1&&(c==1)+(d==2)==1&&(c==5)+(d==3)==1&&(e==4)+(a==1)==1)
                            printf("%d%d%d%d%d\n",a,b,c,d,e);
                    }
                }
            }
        }
    }
    system("pause");
    return 0;

}
![图](https://img-blog.csdn.net/20160708203732840)

看这些答案可以看出来我们其实只要第一个答案,也只有第一个答案是对的,因为其他的都不符合常理。所以这样来说这串代码是有问题的,没有一个筛选条件。也有人说在后面加个return 0;也就是只要我们得到的第一个答案,一有符合我们代码逻辑的值,直接return 0;跑出来的也是我们想要的答案,但是这样是不对的,因为我们肯定是要将所有满足条件的答案都要过一遍的,就像你凭什么说第一个答案就是正确的呢,这样是不严谨的。
所以我们在得出答案后再加一个判定。
int main()
{
    int a,b,c,d,e;
    int num = 0;
    for(a = 1; a<=5;a++)
    {
        for(b = 1; b<=5; b++)
        {
            for(c=1; c<=5; c++)
            {
                for(d=1; d<=5; d++)
                {
                    for(e=1; e<=5; e++)
                    {
                        if(((b==1)+(a==3)==1)
                         &&((b==2)+(e==4)==1)
                         &&((c==1)+(d==2)==1)
                         &&((c==5)+(d==3)==1)
                         &&((e==4)+(a==1)==1)
                         )
                        {
                            num = 0;
                            num |= (1<<(a-1));//a=3
                            num |= (1<<(b-1));
                            num |= (1<<(c-1));
                            num |= (1<<(d-1));
                            num |= (1<<(e-1));
                            while(num)
                            {
                                if(num % 2==0)
                                    break;
                                num = num/2;
                            }
                            if(num == 0)
                            {
                                printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

这样就可以完美的求出答案来。
为什么这里可以通过|=移位来过滤掉其他不符合现实的答案呢
这里就不一一说了,可以自己试试代码,自己用不符合条件的值来算算。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值