A:“罪犯在B、C、D三人之中。”
B:“我沒有作案,是C偷的。”
C:“在A和D中間有一個是罪犯。”
D:“B說的是事實”
經過充分的調查,證實四人中只有兩人說了真話,並且罪犯只有一個。請確定真正的罪犯。
解答:
#include <stdio.h>
int main(int argc, char *argv[])
{
//假設A是罪犯
unsigned int killer = 'A';
int flags = 0;//A、B、C、D說真話的值為1,說假話為0,四個人所說真假的和
//假設A、B、C、D都是罪犯,遍歷四種可能
for(killer = 'A'; killer <= 'D'; killer++)
{
flags = (killer == 'B' || killer == 'C' || killer == 'D');
flags += (killer == 'C');
flags += (killer == 'A' || killer == 'D');
flags += (killer == 'C');
if(flags == 2)//A、B、C、D中有兩個人說的是真話
{
printf("killer is %c\n", killer);
}
}
return 0;
}輸出結果:killer is D2、小狗、小兔、小貓、小猴和小鹿參加百米賽跑,比賽結束後, 小猴說:“我比小貓跑得快。”小狗說:“小鹿在我的前面沖過了終點線。”
小兔說:“我的名次排在小猴的前面,小狗的後面。”
請根據他們的回答排出名次。
解答:
#include <stdio.h>
int main(int argc, char **argv)
{
//小狗、小兔、小貓、小猴、小鹿分別定義為a,b,c,d,e
unsigned int a, b, c, d, e;
for(a = 1; a <= 5; a++)
{
for(b = 1; b <= 5; b++)
{
if(a == b)
continue;
for(c = 1; c <= 5; c++)
{
if(a == c || b == c)
continue;
for(d = 1; d <= 5; d++)
{
if(a == d || b == d || c == d)
continue;
e = 15 -a -b -c -d;
if((d < c) && (e < a) && (b < d) && (b > a))
{
printf("小狗 :%d\n", a);
printf("小兔 :%d\n", b);
printf("小貓 :%d\n", c);
printf("小猴 :%d\n", d);
printf("小鹿 :%d\n", e);
}
}
}
}
}
return 0;
}輸出結果:小狗 :2小兔 :3
小貓 :5
小猴 :4
小鹿 :1
3、甲、乙、丙、丁四人參加一次數學競賽。賽後,他們四人預測名次的談話如下:
甲說:“丙得第一,我第三名”; 乙說:“我第一名,丁第四名”;
丙說:“丁第二名,我第三名”;
丁沒說話。
當最後結果公布時發現,甲乙丙都只說對了一半,請給出正確的四人名次。
解答:
#include <stdio.h>
int main(int argc, char **argv)
{
//甲乙丙丁分別為a,b,c,d
unsigned int a,b,c,d;
//a為1-4時
for(a = 0; a <= 4; a++)
{
for(b = 0; b <= 4; b++)
{
for(c = 0; c <= 4; c++)
{
for(d = 0; d <= 4; d++)
{
if(a + b + c + d == 10)
{
//a,b,c,d的值不能相同
if(a == b || a == c || a == d || b == c || b == d || c == d)
continue;
if(((c == 1)+(a == 3) == 1) && ((b == 1)+(d == 4) == 1) && ((d == 2)+(c == 3) == 1))
{
printf("a is %d\n", a);
printf("b is %d\n", b);
printf("c is %d\n", c);
printf("d is %d\n", d);
}
}
}
}
}
}
return 0;
}輸出結果:a is 3b is 1c is 4d is 2邏輯推理題的解題思路一般采用多重循環,窮舉所有的可能情況,將給出的條件轉換為C語言中的邏輯判斷表達式,打印出符合條件的選項。本文出自 “生命不息,奮斗不止” 博客,轉載請與作者聯系!