Ⅰ 一道關於邏輯推理的c語言編程題

||#include <stdio.h>

int main(void)
{
const char players[6] = {'A', 'B', 'C', 'D', 'E', 'F'};
int w; /* w = winner */
int jia, yi, bing, ding;

for (w=0; w<6; w++) {
jia = (w==1 || w==2);
yi = (w != 3);
bing = (w!=4 && w!=5 && w!=6);
ding = (w==4 || w==5 || w==6);
/* one of them is right */
if (jia+yi+bing+ding == 1) printf("Winner is %c\n", players[w]);
}

return 0;
}

Ⅱ 求大神幫忙離散數學推理問題,同時講述一下C語言演算法可好

int a = 0;
int b = 0;
int a_time = 0;
int a_lock = 0;
int b_time = 0;
int b_lock = 0;
void chk()
{
//鎖要麼是鎖了的要麼不知道鎖沒鎖
if((a_lock==0 || a_lock==2)
&&(b_lock==0 || b_lock==2)
)
{
//如果知道時間,那麼口徑一致
if(a_time>0 && b_time>0)
{
if(a_time==b_time)
{
printf("結果A:%d,B%d",a,b);
}
}
//如果有一個不知道時間也對
if(a_time==0 || b_time==0)
{
printf("結果A:%d,B%d",a,b);
}
}
}

void main()
{
//A作案的情況
a=1;b=0;
a_time = 1;
a_lock = 0;
b_time = 2;
b_lock = 1;
chk();

//B作案的情況(什麼都不確定)
a=0;b=1;
a_time = 0;
a_lock = 0;
b_time = 0;
b_lock = 0;
chk();
}

Ⅲ 如何做c語言邏輯推理問題

1、在一條街上,有5座房子,噴了5種顏色。
2、每個房裡住著不同國籍的人
3、每個人喝不同的飲料,抽不同品牌的香煙,養不同的寵物
問題是:誰養魚?
提示:
1、英國人住紅色房子
2、瑞典人養狗
3、丹麥人喝茶
4、綠色房子在白色房子左面
5、綠色房子主人喝咖啡
6、抽Pall Mall 香煙的人養鳥
7、黃色房子主人抽Dunhill 香煙
8、住在中間房子的人喝牛奶
9、挪威人住第一間房 -
10、抽Blends香煙的人住在養貓的人隔壁
11、養馬的人住抽Dunhill 香煙的人隔壁
12、抽Blue Master的人喝啤酒
13、德國人抽Prince香煙
14、挪威人住藍色房子隔壁
15、抽Blends香煙的人有一個喝水的鄰居
#include<stdio.h>
char*COL[]={NULL,"紅","黃","綠","藍","白"};
char*PAD[]={NULL,"狗","貓","魚","鳥","馬"};
char*DRK[]={NULL,"茶 ","牛奶","咖啡","啤酒","水 "};
char*GUO[]={NULL,"挪威","英國","德國","丹麥","瑞典"};
char*SMK[]={NULL,"Blends","BlueMaster","Dunhill","Pall Mall","Prince"};
struct{ char guojia, color, pads, drink, smoke; } aa[5];
int OK(void)
{
int i,j;
for(i=0;i<5;i++)
if(aa[i].guojia==2 && aa[i].color==1)goto next1;
return 0;
next1:
for(i=0;i<5;i++)
if(aa[i].guojia==5 && aa[i].pads==1)goto next2;
return 0;
next2:
for(i=0;i<5;i++)
if(aa[i].guojia==4 && aa[i].drink==1)goto next3;
return 0;
next3:
for(i=0;i<5;i++)
if(aa[i].color==3)goto next3_1;
return 0;
next3_1:
for(j=i+1;j<5;j++)
if(aa[j].color==5)goto next4;
return 0;
next4:
for(i=0;i<5;i++)
if(aa[i].color==3 && aa[i].drink==3)goto next5;
return 0;
next5:
for(i=0;i<5;i++)
if(aa[i].smoke==4 && aa[i].pads==4)goto next6;
return 0;
next6:
for(i=0;i<5;i++)
if(aa[i].color==2 && aa[i].smoke==3)goto next7;
return 0;
next7:
for(i=0;i<5;i++)
if(aa[i].guojia==3 && aa[i].smoke==5)goto next10;
return 0;
next10:
for(i=0;i<5;i++)
if(aa[i].smoke==2 && aa[i].drink==4)goto next11;
return 0;
next11:
for(i=0;i<5;i++)
if(aa[i].smoke==3)goto next12_1;
next12_1:
if(i==0){if(aa[1].pads==5)goto next13;}
else if(i==4){if(aa[3].pads==5)goto next13;}
else if(aa[i-1].pads==5||aa[i+1].pads==5)goto next13;
return 0;
next13:
for(i=0;i<5;i++)
if(aa[i].smoke==1)goto next13_1;
next13_1:
if(i==0){if(aa[1].pads==2)goto next14;}
else if(i==4){if(aa[3].pads==2)goto next14;}
else if(aa[i-1].pads==2||aa[i+1].pads==2)goto next14;
return 0;
next14:
for(i=0;i<5;i++)
if(aa[i].smoke==1)goto next14_1;
next14_1:
if(i==0){if(aa[1].drink==5)goto next15;}
else if(i==4){if(aa[3].drink==5)goto next15;}
else if(aa[i-1].drink==5||aa[i+1].drink==5)goto next15;
return 0;
next15:
return 1;
}
char color[4]={1,2,3,5};
char drink[4]={1,3,4,5};
char guojia[4]={2,3,4,5};
char smoke[]={1,2,3,4,5};
char pads[5]={1,2,3,4,5};
int rot(char a[],int n)
{ int i,j,k,t;
for(k=n-1;k>0;k--)
if(a[k-1]<a[k])break;
if(k==0)
{ for(i=0,j=n-1;i<j;i++,j--)
{char t=a[i];
a[i]=a[j];
a[j]=t;
}
return 0;
}
t=a[k-1];i=k;
for(j=k+1;j<n;j++)
if(t<a[j]&&a[j]<a[i])i=j;
a[k-1]=a[i];a[i]=t;
for(i=k;i<n-1;i++)
for(j=k;j<n-1+k-i;j++)
if(a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
return 1;
}
int main()
{ int i,j,k,ans=0;
int i1,i2,i3,i4,i5;
aa[1].color=4;
aa[2].drink=2;
aa[0].guojia=1;
for(i1=0;i1<24;i1++){
aa[0].color=color[0];
aa[2].color=color[1];
aa[3].color=color[2];
aa[4].color=color[3];
rot(color,4);
for(i2=0;i2<24;i2++){
aa[0].drink=drink[0];
aa[1].drink=drink[1];
aa[3].drink=drink[2];
aa[4].drink=drink[3];
rot(drink,4);
for(i3=0;i3<24;i3++){
aa[1].guojia=guojia[0];
aa[2].guojia=guojia[1];
aa[3].guojia=guojia[2];
aa[4].guojia=guojia[3];
rot(guojia,4);
for(i4=0;i4<120;i4++){
for(i=0;i<5;i++)
aa[i].smoke=smoke[i];
rot(smoke,5);
for(i5=0;i5<120;i5++){
for(j=0;j<5;j++)
aa[j].pads=pads[j];
rot(pads,5);
if(OK()){
printf("---------------------第%d種解---------------------\n",++ans);
for(k=0;k<5;k++)
printf("第%d戶: %s人 %s房子 養%s 喝%s 抽%s\n",k+1,GUO[aa[k].guojia],
COL[aa[k].color],PAD[aa[k].pads],DRK[aa[k].drink],SMK[aa[k].smoke]);
}}}}}}
return 0;
}

Ⅳ C語言程序設計--推理題

這個題目主要考察數學建模能力,如何將現實生活中的東西抽象出來計算機可以認識的東西。對於這題目,我是這樣思考的:

1.王,李,杜,三個人,計算機如何才能區別和認識呢?很簡單,直接拿三個臨時變數來表示就可以了,可以用intWang,Li,Du,三個整型變數區分,對於我們來說可以很清楚這三個變數表示這三個人,計算機也可以清楚認識,這只是三個不同的變數。

2.公務員,空姐,司機,其實跟剛才三個人的表示是一樣的,我們也可以用三個變數來區分表示這三個職業,由於這三個變數是已經確定的了,所以表示就很容易了,用宏定義表示。

#defineGWY1

#defineKJ2

#defineSJ3

3.接下來每個人都說了兩句話,我們可以根據我們前兩步定義的變數來表示每個人說過的話。例如:王說的話:王當上了公務員,李當上了空姐;用代碼表示:Wang=GWY,Li=KJ;其他兩個人說的話同理可得,李:王當上了空姐,杜當上了公務員;Wang=KJ,Du=GWY;

杜:王當上了司機,李當上了公務員;Wang=SJ,Li=GWY;

4.接下來,題目又給出了有用信息,每個人說的話,只有一半是對的,即這三組中每組只有一個初始話是對的,又根據題目可以知道,這三個人的職業的都是不相同的。所以,用我們剛才聲明的變數來表示的話,就是Wang,Li,Du這三個變數最後會初始化為不同的值(GWY,KJ,SJ),1或者2或者3。

5.那我們可以通過一個循環來依次判斷每個人說的話,最後判斷,如果最後初始化Wang,Li,Du三個變數都不相同,則說明三個人的職業不想同,就可以得到正確的結果了。

具體代碼如下:

#include <stdio.h>
#define MSGCNT 2 /*每個人說了兩句話*/
#define GWY 1 /*定義公務員*/
#define KJ 2 /*定義空姐*/
#define SJ 3 /*定義司機*/
int main()
{
int Wang,Li,Du;/*聲明三個人,王,李,杜*/
int i,j,k;
for(i=0;i<MSGCNT;i++)
for(j=0;j<MSGCNT;j++)
for(k=0;k<MSGCNT;k++)
{
(i == 0)?(Wang == GWY):(Li = KJ);
(j == 0)?(Wang = KJ):(Du = GWY);
(k == 0)?(Wang = SJ):(Li = GWY);
if((Wang != Li) && (Li != Du) && (Wang != Du))
{
break;
}
}
printf("公務員數值=%d 空姐數值=%d 司機數值=%d ",GWY,KJ,SJ);
printf("Wang = %d Li = %d Du = %d ",Wang,Li,Du);
return 0;
}


#include &amp;lt;stdio.h&amp;gt;
#define MSGCNT 2 /*每個人說了兩句話*/
#define GWY 1 /*定義公務員*/
#define KJ 2 /*定義空姐*/
#define SJ 3 /*定義司機*/
int main()
{
int Wang,Li,Du;/*聲明三個人,王,李,杜*/
int i,j,k;
for(i=0;i&amp;lt;MSGCNT;i++)
for(j=0;j&amp;lt;MSGCNT;j++)
for(k=0;k&amp;lt;MSGCNT;k++)
{
(i == 0)?(Wang == GWY):(Li = KJ);
(j == 0)?(Wang = KJ):(Du = GWY);
(k == 0)?(Wang = SJ):(Li = GWY);
if((Wang != Li) &amp;amp;&amp;amp; (Li != Du))
{
break;
}
}
printf("公務員數值=%d 空姐數值=%d 司機數值=%d ",GWY,KJ,SJ);
printf("Wang = %d Li = %d Du = %d ",Wang,Li,Du);
return 0;
}

Ⅳ 怎麼樣求解一道關於邏輯推理的題目,用c語言實現。比如破案,比如誰誰在撒謊,比如誰誰說的是真話。

例子:
誰是竊賊
公安人員審問四名竊賊嫌疑犯。已知,這四人當中僅有一名是竊賊,還知道這四人中每人要麼是誠實的,要麼總是說謊的。在回答公安人員的問題中:
甲說:「乙沒有偷,是丁偷的。」
乙說:「我沒有偷,是丙便的。」
丙說:「甲沒有偷,是乙偷的。」
丁說:「我沒有偷。」
請根據這四人的答話判斷誰是盜竊者。
*問題分析與演算法設計
假設A、B、C、D分別代表四個人,變數的值為1代表該人是竊賤。
由題目已知:四人中僅有一名是竊賤,且這四個人中的每個人要麼說真話,要麼說假話,而由於甲、乙、丙三人都說了兩句話:「X沒偷,X偷了」,故不論該人是否說謊,他提到的兩人中必有一人是小偷。故在列條件表達式時,可以不關心誰說謊,誰說實話。這樣,可以列出下列條件表達式:
甲說:」乙沒有偷,是丁偷的。」 B+D=1
乙說:「我沒有偷,是丙偷有。」 B+C=1
丙說:「甲沒有偷,是乙偷的。」 A+B=1
丁說:「我沒有偷。」 A+B+C+D=1
其中丁只說了一句話,無法判定其真假,表達式反映了四人中僅有一名是竊賤的條件。
*程序與程序注釋
#include<stdio.h>
void main()
{
int i,j,a[4];
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
if(j==i)a[j]=1;
else a[j]=0;
if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1)
{
printf("The thief is ");
for(j=0;j<=3;j++)
if(a[j])printf("%c.",j+\'A\');
printf("\\n");
}
}
}
*運行結果
The thief is B. (乙為竊賤。)
//關鍵思路就是用循環枚舉,依次假設某個人是竊賊,然後代入到他們的敘述中,用if判斷看是否滿足,如果滿足,假設的那個人就是;不滿足,接著假設。

Ⅵ 用C語言解決一道推理題(真正有本事的人進來),寫出它的思路、演算法和源程序

其實這題並不算太難,關鍵就是M和說的那4句話.理解那4句話,後面就好做多了.首先看"有兩個數a和b 已知a,b>1並a<b M知道a*b的值 S知道a b的值"和"對於給定的x,y 2<=x,y<=550 且x<=a<b<=y "這兩段話很容易理解,主要看x<=a<b<=y這個公式,這個公式其實就是告訴你a和b的取值范圍由於,a要小於b所以就可以確定a的取值范圍是2~549,b的取值范圍是3~550.因為a永遠要小於b,所以a為最小值2的時候b為3,b為最大值的時候a為最大值減1就是549.確定了a和b的范圍再來看那4句話.首先M:我不知道a和b的值意思就是我光看a和b的積沒辦法判斷值然後S:我也不知道a和b的值,但我先前不知道你不知道這句話是關鍵!!S首先說:我也不知道a和b的值.就是說他光看和也推斷不出值,後面又說:但我先前不知道你不知道.這句話可以這樣理解.就是說如果我先前知道你不知道我就知道了.整句話也就是說在S一眼看不出來的情況下,必須M一眼也看不出來!!!接下來是代碼:
#include <stdio.h>

void jisuan(int ,int);

void main()
{
unsigned int a=0;
unsigned int b=0;
unsigned int add=0;//a+b的和
unsigned int multiply=0;//a*b的積

for(a=2;a<550;a++)
{
for(b=3;b<551;b++)
{
if(a>=b)
continue;
add=a+b;
multiply=a*b;
jisuan(add,multiply);
}
}
printf("\n");
}

void jisuan(int a,int b)
{
int i=0;
int j=0;
unsigned int num1=0;
unsigned int num2=0;

unsigned int x[500];
unsigned int y[500];
unsigned int m[500];
unsigned int n[500];

unsigned int count=0;
unsigned int count2=0;

for(i=2;;i++)//計算x*y有多少種方法可以等於b(a*b的積)
{
if(b%i)
continue;
y[count]=b/i;
x[count]=i;
if(x[count]>y[count]||x[count]==y[count])
{
x[count]=0;
y[count]=0;
break;
}
count++;
}
for(j=2;;j++)//計算x+y有多少種方法可以等於a(a+b的和)
{
m[count2]=a-j;
n[count2]=j;
if(n[count2]>m[count2]||n[count2]==m[count2])
{
m[count2]=0;
n[count2]=0;
break;
}
count2++;
}
//如果上面兩段代碼的任意一個只有一種方法也就是一眼就能看
//出來那就舍棄
if(count==1||count2==1)
return;
else
{
i=0;
while(x[i]!=0&&y[i]!=0&&m[i]!=0&&n[i]!=0)
{
if(x[i]==n[i]&&y[i]==m[i])
{
num1=x[i];
num2=y[i];
}
i++;
}
if(num1==0||num2==0)
return;
}
printf("%-3d%-3d ",num1,num2);
}
回答完畢!
題外話:由於數字太大的原因,輸出的結果可能不太理想!!!把unsigned int換成double會好些.

Ⅶ 用C語言編程 邏輯推理判斷題

#include<stdio.h>
int main()
{
int i,j,t;
for(i=1;i<=4;i++)
{
t=(i==2)+(i==4)+(i!=3)+(i!=4);
if(t==1)break;
}
printf("\n\n最好的一款車是: %d號賽車\n\n",i);
if(i==2)printf("A說對了");
if(i==4)printf("B說對了");
if(i!=3)printf("C說對了");
if(i!=4) printf("D專家內的評論是正確的。容\n\n");
return 0;
}

Ⅷ C語言邏輯推理問題...幫忙解釋程序

|!for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;a++)
for(d=0;d<=1;b++)
for(e=0;e<=1;a++)
for(f=0;f<=1;b++)
if((a||襲b)&&(!a||!b||!c)&&((a&&!c)||(!a&&c))&&((b&&c)||(!b&&!c))&&((c&&!d)||(d&&!c))&&(!d&&!e))
列印作案人...
做法就是
1
每條條件之間是與關系
2
把每條條件轉化為邏輯表達式
3
用與連起來

Ⅸ 用C語言解推理題

#include<stdio.h>

#include<stdlib.h>

intmain()

{

staticinta=0,b=0,c=0,d=0,e=0,f=0;

for(a=0;a<2;a++)

{

for(b=0;b<2;b++)

{

for(c=0;c<2;c++)

{

for(d=0;d<2;d++)

{

for(e=0;e<2;e++)

{

for(f=0;f<2;f++)

{

if(a+b==0)

continue;//A、B至少有1人作案

elseif(a+e+f==0||a+e+f==1)

continue;//A、E、F,3人中至少有2人參與作案

elseif(a==d)

continue;//A、D不可能是同案犯

elseif(b!=c)

continue;//B、C或同時作案,或都與本案無關

elseif(c==d)

continue;//C、D中有且僅有一人作案

elseif(d==0&&e==1)//如果D沒有參與作案,則E也不可能參與作案

continue;

else

{

printf("作案人員如下,前面代表人,後面1代表作案,0代表沒作案 ");

printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d ",a,b,c,d,e,f);

}

}

}

}

}

}

}

system("pause");

return0;

}

Ⅹ c語言判斷一條推理題

這么簡單的問題搞得這么復雜
boolr[4]=0;
for(intbest=1;best<=4;best++){
r[0]=best==2;
r[1]=best==4;
r[2]=best==3;
r[3]=!r[1];
if(r[0]+r[1]+r[2]+r[3]==1){
printf("%d最好專",best);
inti=0;
while(r[i]==0)
i++;
switch(i){
case0:
printf("A對 ");屬
break;
case1:
}
break;
}
}