⑴ 用c语言解决一道推理题(真正有本事的人进来),写出它的思路、算法和源程序
其实这题并不算太难,关键就是M和S说的那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>
typedefstruct{
intP,Q,R,S;
}Result;
intcheckPQ(Resultconst*constr){
if(r->P)//ifPistrue,Qmustbetrue.
returnr->Q;
return1;
}
intcheckQR(Resultconst*constr){//Q&&R=false;
return!(r->Q&&r->R);
}
intcheckRS(Resultconst*constr){//R||S=true;
returnr->R||r->S;
}
intcheckSQ(Resultconst*constr){//ifSistrue,Qisfalse
if(r->S)
return!r->Q;
return1;
}
intcheckPQRS(Resultconst*constr){
return2==r->P+r->Q+r->R+r->S;//only2istrue.
}
intmain()
{
Resultr;
for(inti=0;i<16;++i){
intj=i;
r.P=j%2;j/=2;
r.Q=j%2;j/=2;
r.R=j%2;j/=2;
r.S=j%2;
if(checkPQRS(&r)&&checkPQ(&r)&&checkQR(&r)&&checkRS(&r)&&checkSQ(&r))
printf("P=%d,Q=%d,R=%d,S=%d ",r.P,r.Q,r.R,r.S);
}
}
符号化短路略做简化版本:
#include<stdio.h>
typedefstruct{
intP,Q,R,S;
}Result;
intcheckPQ(Resultconst*constr){
returnr->P&&r->Q||!r->P;//ifpistrue,qmustbetrue.
}
intcheckQR(Resultconst*constr){//Qconst*const*R=false;
return!(r->Q&&r->R);
}
intcheckRS(Resultconst*constr){//R||S=true;
returnr->R||r->S;
}
intcheckSQ(Resultconst*constr){//ifSistrue,Qisfalse
returnr->S&&!r->Q||!r->S;
}
intcheckPQRS(Resultconst*constr){
returnr->P+r->Q+r->R+r->S==2;//only2istrue.
}
intmain()
{
Resultr;
for(inti=0;i<16;++i){
intj=i;
r.P=j%2;j/=2;
r.Q=j%2;j/=2;
r.R=j%2;j/=2;
r.S=j%2;
if(checkPQRS(&r)&&checkPQ(&r)&&checkQR(&r)&&checkRS(&r)&&checkSQ(&r))
printf("P=%d,Q=%d,R=%d,S=%d ",r.P,r.Q,r.R,r.S);
}
}
输出结果
P=0,Q=0,R=1,S=1
⑶ c语言 张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真
如果连这种问题你都搞不定的话,别学计算机了.结果是:张三在说谎,李四说真话,王五说谎.这种问题一般先假定一真,再来逻辑推理得出结论
⑷ 用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语言打碎花瓶题目
int a[4] = {0}; // a[0]:甲;a[1]:乙;a[2]:丙;a[3]:丁
/*0表示没打碎,1表示打碎:
* 甲说:乙没有打碎,是丁打碎的 -> a[1]+a[3] == 1
* 乙说:我没有打碎,是丙打碎的 -> a[1]+a[2] == 1
* 丙说:甲没有打碎,是乙打碎的 -> a[0]+a[1] == 1
*/
if (a[1]+a[3] == 1 && a[1]+a[2] == 1 && a[0]+a[1] == 1)
为什么上述条件这么写呢?我猜测是因为“4个人中每个人要么是诚实的,要么总是说谎的。”我没看懂这个条件。
此类逻辑推理题,说谎与诚实这个条件是很重要的,由此,我用C语言实现了另一道逻辑推理题,供参考。
⑺ 怎么样求解一道关于逻辑推理的题目,用c语言实现。比如破案,比如谁谁在撒谎,比如谁谁说的是真话。
比较费劲,我觉得关键是一定要搞清楚 要用什么条件表达式表示真假的组合。然后套在一堆儿循环里遍历所有的情况,找个所有条件都满足的就是了。
⑻ 用C语言来解答这道题
#include <stdio.h>
main()
{printf("啥鸡把玩意儿!");
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 &lt;stdio.h&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&lt;MSGCNT;i++)
for(j=0;j&lt;MSGCNT;j++)
for(k=0;k&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; (Li != Du))
{
break;
}
}
printf("公务员数值=%d 空姐数值=%d 司机数值=%d ",GWY,KJ,SJ);
printf("Wang = %d Li = %d Du = %d ",Wang,Li,Du);
return 0;
}