记录今天的成长
1.
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
2.
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说。
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 1; a <= 5;)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; e++)
{
//下面说的是满足每个人只有半句真半句假的条件,此时abcde可以取得所有的情况
if (((b == 1) + (a == 3)) &&
((b == 2) + (e == 4)) &&
((c == 1) + (d == 2)) &&
((c == 5) + (d == 3)) &&
((c == 4) + (a == 1) == 1))
{
//下面这个代码是将tem用0赋初值;此时tem的二进制的所有位均为0,用一个1来和此时的tem或运算,都会
//使这个1所在的位变成1,而这个1的位置就是abcde的值,即a=3时这里1的位置就是从二进制地位的第三位
//这样就使tem在abcde的值所对应的位置上变成了1,如果低位全是1,则可以证明abcde是连续的数
//tem=0000000
// 1
// 0000001
int tem = 0;
int flag = 0;
tem = tem | (1 << (a - 1));//(1 << (a - 1))意思是:将1(二进制)左移a-1位
tem = tem | (1 << (b - 1));
tem = tem | (1 << (c - 1));
tem = tem | (1 << (d - 1));
tem = tem | (1 << (e - 1));
while (tem = 0) //当tem=0时说明已经判断完了
{
if (tem % 2 == 0) //判断tem里面是否有0,如果有则证明这个abcde不是连续的数,如果都是1
//则是连续的。因为a=1b=1 c=2 d=2d=3,时tem的低三位为111,通过%2来判断
{ //这位是1还是0,通过/2来求tem的所有位
flag = 1;
break;
}
tem = tem / 2;
}
if (flag == 0)
{
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 1; a <= 5;)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; e++)
{
//下面说的是满足每个人只有半句真半句假的条件,此时abcde可以取得所有的情况
if (((b == 1) + (a == 3)) &&
((b == 2) + (e == 4)) &&
((c == 1) + (d == 2)) &&
((c == 5) + (d == 3)) &&
((c == 4) + (a == 1) == 1))
{
//下面这个代码是将tem用0赋初值;此时tem的二进制的所有位均为0,用一个1来和此时的tem或运算,都会
//使这个1所在的位变成1,而这个1的位置就是abcde的值,即a=3时这里1的位置就是从二进制地位的第三位
//这样就使tem在abcde的值所对应的位置上变成了1,如果低位全是1,则可以证明abcde是连续的数
//tem=0000000
// 1
// 0000001
int tem = 0;
int flag = 0;
tem = tem | (1 << (a - 1));//(1 << (a - 1))意思是:将1(二进制)左移a-1位
tem = tem | (1 << (b - 1));
tem = tem | (1 << (c - 1));
tem = tem | (1 << (d - 1));
tem = tem | (1 << (e - 1));
while (tem = 0) //当tem=0时说明已经判断完了
{
if (tem % 2 == 0) //判断tem里面是否有0,如果有则证明这个abcde不是连续的数,如果都是1
//则是连续的。因为a=1b=1 c=2 d=2d=3,时tem的低三位为111,通过%2来判断
{ //这位是1还是0,通过/2来求tem的所有位
flag = 1;
break;
}
tem = tem / 2;
}
if (flag == 0)
{
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}
int main()
{
int kill = 0;
for (kill = 'a'; kill <= 'd'; kill++)
{
if ((kill != 'a') + //三个真一个假加起来就是3
(kill == 'c') +
(kill == 'd') +
(kill != 'd') == 3)
{
printf("凶手是%c",kill);
getchar();
}
}
return 0;
{
int kill = 0;
for (kill = 'a'; kill <= 'd'; kill++)
{
if ((kill != 'a') + //三个真一个假加起来就是3
(kill == 'c') +
(kill == 'd') +
(kill != 'd') == 3)
{
printf("凶手是%c",kill);
getchar();
}
}
return 0;