1.比赛名次问题
ABCDE参加比赛,那么每个人的名次都有5种可能,即1,2,3,4,5;
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 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 == 2) + (a == 3) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (d == 3) && (c == 5) == 1
&& (e == 4) && (a == 1) == 1)
{
if (a * b * c * d * e == 120)
{
printf("a=%d b=%d c=%d d=%d e=%d", a, b, c, d, e);
}
}
}
}
}
}
}
}
这道题目的主要思想就是使用判断语句,真就是1,假就是0,每位选手只有一个人说的是对的,就是2个判断条件的和是1,使用逻辑与运算符,使得每个人的话都是一半对;
如果这样结束,我们会发现会出现名次相同的情况,所以要使得他们分别对应12345个名次,就要满足名次的乘积是120;
其实我们不难发现,如果这道题目真的使用传统方法解决,很难办,但是当我们使用假就是0,真就是1的时候,就可以很快的得到位序。
2.找凶手问题
这道题目与上一道题的思想类似,但是凶手只有一个人,我们可以依次假设ABCD是凶手,然后根据供词进行判断,如果符合3个真话,1个假话,就可以知道谁是凶手;
如果我们依然使用假就是0,真就是1,那么他们的和是3时,就找到凶手;
int main()
{
char killer = 0;
for (killer = 'a'; killer <= 'd'; killer++)
{
if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
{
printf("%c", killer);
break;
}
}
return 0;
}
如上图所示,利用循环找到凶手之后,使用break终止循环。