Ⅰ 一道关于逻辑推理的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;
}
}