⑴ 用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;
}