日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言24点程序,C语言24点问题

發(fā)布時(shí)間:2024/10/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言24点程序,C语言24点问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題描述

在屏幕上輸入1?10范圍內(nèi)的4個(gè)整數(shù)(可以有重復(fù)),對(duì)它們進(jìn)行加、減、乘、除四則運(yùn)算后(可以任意的加括號(hào)限定計(jì)算的優(yōu)先級(jí)),尋找計(jì)算結(jié)果等于24的表達(dá)式。

例如輸入4個(gè)整數(shù)4、5、6、7,可得到表達(dá)式:4*((5-6)+7)=24。這只是一個(gè)解,要求輸出全部的解。要求表達(dá)式中數(shù)字的順序不能改變。

問(wèn)題分析

本題最簡(jiǎn)便的解法是應(yīng)用窮舉法搜索整個(gè)解空間,篩選出符合題目要求的全部解。因此,關(guān)鍵的問(wèn)題是如何確定該題的解空間。

假設(shè)輸入的4個(gè)整數(shù)為A、B、C、D,如果不考慮括號(hào)優(yōu)先級(jí)的情況,僅用四則運(yùn)算符將它們連接起來(lái),即A+B*C/D…,則可以形成43=64種可能的表達(dá)式。如果考慮加括號(hào)的情況,而暫不考慮運(yùn)算符,則共有以下5種可能的情況:

① ((A□B)□C)□D;

② (A□(B□C))□D;

③ A□(B□(C□D));

④ A□((B□C)□D);

⑤ (A□B)□(C□D)。

其中□代表“+、-、*、/”四種運(yùn)算符中的任意一種。將上面兩種情況綜合起來(lái)考慮,每輸入4個(gè)整數(shù),其構(gòu)成的解空間為64*5=320種表達(dá)式。也就是說(shuō),每輸入4個(gè)整數(shù),無(wú)論以什么方式或優(yōu)先級(jí)進(jìn)行四則運(yùn)算,其結(jié)果都會(huì)在這320種答案之中。在這320種表達(dá)式中尋找出計(jì)算結(jié)果為24的表達(dá)式。

算法設(shè)計(jì)

首先將3個(gè)不同位置上的運(yùn)算符設(shè)置成不同的變量:op1、op2、op3,并規(guī)定op1為整數(shù)A與B之間的運(yùn)算符;op2為整數(shù)B與C之間的運(yùn)算符;op3為整數(shù)C與D之間的運(yùn)算符。

A op1 B op2 C op3 D

又規(guī)定變量op1、op2、op3取值范圍為1、2、3、4,分別表示加、減、乘,除四種運(yùn)算,如下表所示。

op1? op2? op3變量值

表示的運(yùn)算

1

+

2

-

3

*

4

/

這樣通過(guò)一個(gè)三重循環(huán)就可以枚舉出不考慮括號(hào)情況的64種表達(dá)式類型。算法如下:

for(op1=1;op1<=4;op1++)

for(op2=1;op2<=4;op2++)

for(op3=1;op3<=4;op3++)

{

//得到一種不含括號(hào)的表達(dá)式情形:A op1 B op2 C op3 D

}

下面的問(wèn)題就是考慮如何在表達(dá)式中添加括號(hào),以及如何通過(guò)每種表達(dá)式的狀態(tài)計(jì)算出對(duì)應(yīng)的表達(dá)式的值。

首先,上述算法得到的每一種表達(dá)式都可能具有5種添加括號(hào)的方式,而這5種添加括號(hào)的方式實(shí)際上涵蓋了該表達(dá)式的所有可能優(yōu)先級(jí)的運(yùn)算。例如:表達(dá)式A+B-C*D的5種添加括號(hào)的方式為:

① ((A+B)-C)*D;

② (A+(B-C))*D;

③ A+(B-(C*D));

④ A+((B-C)*D);

⑤ (A+B)-(C*D)。

實(shí)際上,對(duì)表達(dá)式A+B-C*D以任何優(yōu)先級(jí)方式運(yùn)算,都包含在這5種表達(dá)式之中。

下面是完整的代碼:

#include

char op[5]={'#', '+', '-', '*', '/',};

float cal(float x, float y, int op)

{

switch(op)

{

case 1: return x+y;

case 2: return x-y;

case 3: return x*y;

case 4: return x/y;

default: return 0.0;

}

}

float calculate_model1(float i, float j, float k, float t, int op1, int op2, int op3)

{

float r1, r2, r3;

r1 = cal(i, j, op1);

r2 = cal(r1, k, op2);

r3 = cal(r2, t, op3);

return r3;

}

float calculate_model2(float i, float j, float k, float t, int op1, int op2, int op3)

{

float r1, r2, r3;

r1 = cal(j, k, op2);

r2 = cal(i, r1, op1);

r3 = cal(r2, t, op3);

return r3;

}

float calculate_model3(float i, float j, float k, float t, int op1, int op2, int op3)

{

float r1, r2, r3 ;

r1 = cal(k, t, op3);

r2 = cal(j, r1, op2);

r3 = cal(i, r2, op1);

return r3;

}

float calculate_model4(float i, float j, float k, float t, int op1, int op2, int op3)

{

float r1, r2, r3;

r1 = cal(j, k, op2);

r2 = cal(r1, t, op3);

r3 = cal(i, r2, op1);

return r3;

}

float calculate_model5(float i,float j,float k,float t,int op1,int op2,int op3)

{

float r1, r2, r3 ;

r1 = cal(i, j, op1);

r2 = cal(k, t, op3);

r3 = cal(r1, r2, op2);

return r3;

}

int get24(int i, int j, int k, int t)

{

int op1, op2, op3;

int flag=0;

for(op1=1; op1<=4; op1++)

for(op2=1; op2<=4; op2++)

for(op3=1; op3<=4; op3++)

{

if(calculate_model1(i, j, k, t, op1, op2, op3)==24)

{

printf("((%d%c%d)%c%d)%c%d=24\n", i, op[op1], j, op[op2], k, op[op3], t);

flag = 1;

}

if(calculate_model2(i, j, k, t, op1, op2, op3)==24)

{

printf("(%d%c(%d%c%d))%c%d=24\n", i, op[op1], j, op[op2], k, op[op3], t);

flag = 1;

}

if(calculate_model3(i, j, k, t, op1, op2, op3)==24)

{

printf("%d%c(%d%c(%d%c%d))=24\n", i, op[op1], j, op[op2], k, op[op3], t);

flag = 1;

}

if(calculate_model4(i, j, k, t, op1, op2, op3)==24)

{

printf("%d%c((%d%c%d)%c%d)=24\n", i, op[op1], j, op[op2], k, op[op3], t);

flag = 1;

}

if(calculate_model5(i, j, k, t, op1, op2, op3)==24)

{

printf("(%d%c%d)%c(%d%c%d)=24\n", i, op[op1], j, op[op2], k, op[op3], t);

flag = 1;

}

}

return flag;

}

int main()

{

int i, j, k, t;

printf("Please input four integer (1~10)\n");

loop: scanf("%d %d %d %d", &i, &j, &k, &t);

if(i<1||i>10 || j<1||j>10 || k<1||k>10 || t<1||t>10)

{

printf("Input illege, Please input again\n");

goto loop;

}

if( get24(i, j, k, t) );

else

printf("Sorry, the four integer cannot be calculated to get 24\n");

return 0;

}

運(yùn)行結(jié)果:

Please input four integer (1~10)

1 2 3 4↙?

((1+2)+3)*4=24

(1+(2+3))*4=24

((1*2)*3)*4=24

(1*(2*3))*4=24

1*(2*(3*4))=24

1*((2*3)*4)=24

(1*2)*(3*4)=24

總結(jié)

以上是生活随笔為你收集整理的c语言24点程序,C语言24点问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。