1.5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。C选手说:我第一,D第二。
D选手说:C最后,我第三。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
题目分析:看到这个题目,我们应该能想到利用多层for循环,然后再加个上边的条件进行判断;当你这样做并且
在编译器下跑时,你会发现会出现各种各种的结果,比如,1,2,4,4,5(假设这是五名运动员A,B,C,D,E的比赛排
名),这明显是不对,这组数不连续,(日常生活中的比赛排名是这样,1,1,3,4,5,在此我们认为名次连续,即是
1,1,2,3,4)所以,我们就需要判断一组数是否连续,功能强大的位运算符就可以做到。
代码展示:
代码分析:代码加红部分是程序重点。
比如,a=2,b=3,c=1,d=4,e=4是符合if条件的组合,我们来看这组数是否是连续的。我们可以设定五位 bits就足够,当名次组成的二进制数中,1的中间夹有0,便认为该组数据不符合要求。
设n=0;00000000(只画出低八位)
a=2;n|=(1<<(2-1)),此时n=00000010
b=3;n | = (1<<(3-1));此时n=00000110
剩下的数据自己分析一下,最后n=00001111
低4位连续为1,(判断方法模除法见代码)
再如,n=00001110,是不符合要求的,第一名没人得,后边几名都有人,这是不可能的。
注意,每次进入if条件判断,成立后,标志位flag需重置零。if语句的加号不可替换成||(1||1 == 1)。
2.日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
代码展示:
代码分析:此题亦可用位运算符来完成,比如,a说不是他。此时二进制序列为01 1 1(嫌疑犯记为1),b说,00 1 0,c说00 0 1,d说,11 1 0,由于3个人说了真话,所以断定是c。有兴趣的自己实现一下。
本人是初学者,如以上有不合理的地方,还请指出~~