最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題詳解

 更新時(shí)間:2021年12月30日 09:09:24   作者:小輝_Super  
24點(diǎn)問(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á)式。本文將通過(guò)C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(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)題分析

這道題理解起來(lái)很簡(jiǎn)單,就是拼湊加減乘除,使4個(gè)數(shù)的運(yùn)算結(jié)果等于24。

由于四則運(yùn)算中,乘除的優(yōu)先級(jí)高于加減,所以必須“加括號(hào)”來(lái)限定4個(gè)數(shù)之間運(yùn)算優(yōu)先級(jí)。

例如:A+B*C-D 這個(gè)式子,通過(guò)增加括號(hào),可以產(chǎn)生多種結(jié)果,比如 (A+B)*(C-D) 和 A+(B*C-D)。

那么總共有幾種加括號(hào)的方法呢,該如何分類呢?

一開始我在想是不是能按照括號(hào)對(duì)數(shù)進(jìn)行分類,但后來(lái)發(fā)現(xiàn),要想將4個(gè)數(shù)字的運(yùn)算優(yōu)先級(jí)細(xì)分,必須使用兩對(duì)括號(hào)。

可以這么理解:我們的目的是將4個(gè)數(shù)的運(yùn)算轉(zhuǎn)換成兩個(gè)“數(shù)”的運(yùn)算(這里的“數(shù)”包括括號(hào)表達(dá)式),而每?jī)蓚€(gè)數(shù)運(yùn)算,就能得出一個(gè)結(jié)果,即每對(duì)括號(hào)可以減少一個(gè)要計(jì)算的數(shù)字(如(A+B)*(C+D)中,A和B運(yùn)算,使式子變成了3個(gè)數(shù),C接著和D運(yùn)算,使式子剩下兩個(gè)數(shù)字)。4-2=2即為需要的括號(hào)數(shù)。

下面列舉所有可能的括號(hào)表達(dá)式:(#表示四則運(yùn)算符)

  1. ((A#B)#C)#D
  2. (A#(B#C))#D
  3. A#((B#C)#D)
  4. A#(B#(C#D))
  5. (A#B)#(C#D)

具體思路:

上面5種括號(hào)表達(dá)式都可以單獨(dú)寫成函數(shù),函數(shù)內(nèi)部按照括號(hào)的優(yōu)先級(jí)+從左往右的順序進(jìn)行運(yùn)算,最后返回計(jì)算結(jié)果。

每個(gè)表達(dá)式中有3個(gè)'#'號(hào),它們是四則運(yùn)算符(+、-、*、/),可以定義一個(gè)全局字符數(shù)組,存放4這四個(gè)字符。

char my_oprator[4] = {'+', '-', '*', '/'};

主函數(shù)使用窮舉法,對(duì)表達(dá)式的每個(gè)#符號(hào)進(jìn)行遍歷(4種運(yùn)算符),使用3層 for循環(huán)實(shí)現(xiàn)(層數(shù)對(duì)應(yīng)3個(gè)#符號(hào),每層循環(huán)4次,對(duì)應(yīng)4種運(yùn)算符),最后將符合條件的表達(dá)式輸出。

【注意】:由于式子中存在除法,所以不能用整型數(shù)據(jù)進(jìn)行計(jì)算(比如(int)(2/4) = 0),應(yīng)該使用float或double類型。

浮點(diǎn)數(shù)的表示是不精確的,所以運(yùn)算結(jié)果不能直接和 24 比較。它們可能只是在某個(gè)范圍內(nèi)相等,如float變量的精度為小數(shù)點(diǎn)后六位,所以我們只要保證小數(shù)點(diǎn)后 6 位和 24 相等(全為0)即可。

可以使用如下語(yǔ)句進(jìn)行判斷:

if(ret - 24 <= 0.000001 && ret - 24 >= -0.000001)

ret為運(yùn)算結(jié)果,這個(gè) if 語(yǔ)句的作用是判斷運(yùn)算結(jié)果 ret 和 24 之間的差值是否超過(guò)±0.000001。

【以上言論僅供參考,未必全對(duì)】

代碼實(shí)現(xiàn)

#include <stdio.h>

#define TARGET_POINT  24    //目標(biāo)點(diǎn)數(shù)

//算術(shù)操作符
char my_oprator[4] = {'+', '-', '*', '/'};

/******************************************************************************
 * @brief 四則運(yùn)算
 * @param x 浮點(diǎn)變量1
 * @param y 浮點(diǎn)變量2
 * @param op 運(yùn)算符
 * @return 運(yùn)算結(jié)果: x op y
 ******************************************************************************/
float Calculate(float x, float y, char op)
{
    switch(op)
    {
        case '+': return x + y;
        case '-': return x - y;
        case '*': return x * y;
        case '/':return x / y;
        default: printf("非法運(yùn)算符\n");
    }
    return 0;
}

/******************************************************************************
 * @brief Expression_1
 * @param a b c d     浮點(diǎn)變量
 * @param op1 op2 op3 運(yùn)算符
 * @return ((A#B)#C)#D 運(yùn)算結(jié)果  #表示運(yùn)算符
 ******************************************************************************/
float Expression_1(float a, float b, float c, float d, char op1, char op2, char op3)
{
    float ret = 0;
    ret = Calculate(a, b, op1);   //求出 A#B 的結(jié)果
    ret = Calculate(ret, c, op2); //求出 ret#C 的結(jié)果
    ret = Calculate(ret, d, op3); //求出 ret#D 的結(jié)果
    return ret;
}

/******************************************************************************
 * @brief Expression_2
 * @param a b c d     浮點(diǎn)變量
 * @param op1 op2 op3 運(yùn)算符
 * @return (A#(B#C))#D 運(yùn)算結(jié)果  #表示運(yùn)算符
 ******************************************************************************/
float Expression_2(float a, float b, float c, float d, char op1, char op2, char op3)
{
    float ret = 0;
    ret = Calculate(b, c, op2);   //求出 B#C 的結(jié)果
    ret = Calculate(a, ret, op1); //求出 A#ret 的結(jié)果
    ret = Calculate(ret, d, op3); //求出 ret#D 的結(jié)果
    return ret;
}

/******************************************************************************
 * @brief Expression_3
 * @param a b c d     浮點(diǎn)變量
 * @param op1 op2 op3 運(yùn)算符
 * @return A#((B#C)#D) 運(yùn)算結(jié)果  #表示運(yùn)算符
 ******************************************************************************/
float Expression_3(float a, float b, float c, float d, char op1, char op2, char op3)
{
    float ret = 0;
    ret = Calculate(b, c, op2);   //求出 B#C 的結(jié)果
    ret = Calculate(ret, d, op3); //求出 ret#D 的結(jié)果
    ret = Calculate(a, ret, op1); //求出 A#ret 的結(jié)果
    return ret;
}

/******************************************************************************
 * @brief Expression_4
 * @param a b c d     浮點(diǎn)變量
 * @param op1 op2 op3 運(yùn)算符
 * @return A#(B#(C#D)) 運(yùn)算結(jié)果  #表示運(yùn)算符
 ******************************************************************************/
float Expression_4(float a, float b, float c, float d, char op1, char op2, char op3)
{
    float ret = 0;
    ret = Calculate(c, d, op3);   //求出 C#D 的結(jié)果
    ret = Calculate(b, ret, op2); //求出 B#ret 的結(jié)果
    ret = Calculate(a, ret, op1); //求出 A#ret 的結(jié)果
    return ret;
}

/******************************************************************************
 * @brief Expression_5
 * @param a b c d     浮點(diǎn)變量
 * @param op1 op2 op3 運(yùn)算符
 * @return (A#B)#(C#D) 運(yùn)算結(jié)果  #表示運(yùn)算符
 ******************************************************************************/
float Expression_5(float a, float b, float c, float d, char op1, char op2, char op3)
{
    float ret1 = 0, ret2 = 0;
    ret1 = Calculate(a, b, op1);   //求出 A#B 的結(jié)果
    ret2 = Calculate(c, d, op3);   //求出 C#D 的結(jié)果
    ret2 = Calculate(ret1, ret2, op2); //求出 ret1#ret2 的結(jié)果
    return ret2;
}

int main()
{
    float a = 0, b = 0, c = 0, d = 0;
    int i = 0, j = 0, k = 0;
    float ret = 0;
    int flag = 0;  //是否有匹配結(jié)果,1:有結(jié)果

    printf("請(qǐng)輸入4個(gè)整數(shù),數(shù)字范圍:1~10,可重復(fù)\n");
    scanf("%f%f%f%f", &a, &b, &c, &d);

    for(i = 0; i < 4; i++)
        for(j = 0; j < 4; j++)
            for(k = 0; k < 4; k++)
            {
                //表達(dá)式1:((A#B)#C)#D
                ret = Expression_1(a, b, c, d,\
                                   my_oprator[i],\
                                   my_oprator[j],\
                                   my_oprator[k]);
                //判斷結(jié)果是否為目標(biāo)點(diǎn)數(shù),精度0.000001
                if(ret - TARGET_POINT <= 0.000001 &&\
                        ret - TARGET_POINT >= -0.000001)
                {
                    printf("((%.0f%c%.0f)%c%.0f)%c%.0f=%.0f\n",\
                           a, my_oprator[i],\
                           b, my_oprator[j],\
                           c, my_oprator[k], d, ret);
                    flag = 1; //成功匹配
                }

                //表達(dá)式2:(A#(B#C))#D
                ret = Expression_2(a, b, c, d,\
                                   my_oprator[i],\
                                   my_oprator[j],\
                                   my_oprator[k]);
                //判斷結(jié)果是否為目標(biāo)點(diǎn)數(shù),精度0.000001
                if(ret - TARGET_POINT <= 0.000001 &&\
                        ret - TARGET_POINT >= -0.000001)
                {
                    printf("(%.0f%c(%.0f%c%.0f))%c%.0f=%.0f\n",\
                           a, my_oprator[i],\
                           b, my_oprator[j],\
                           c, my_oprator[k], d, ret);
                    flag = 1; //成功匹配
                }

                //表達(dá)式3:A#((B#C)#D)
                ret = Expression_3(a, b, c, d,\
                                   my_oprator[i],\
                                   my_oprator[j],\
                                   my_oprator[k]);
                //判斷結(jié)果是否為目標(biāo)點(diǎn)數(shù),精度0.000001
                if(ret - TARGET_POINT <= 0.000001 &&\
                        ret - TARGET_POINT >= -0.000001)
                {
                    printf("%.0f%c((%.0f%c%.0f)%c%.0f)=%.0f\n",\
                           a, my_oprator[i],\
                           b, my_oprator[j],\
                           c, my_oprator[k], d, ret);
                    flag = 1; //成功匹配
                }

                //表達(dá)式4:A#(B#(C#D))
                ret = Expression_4(a, b, c, d,\
                                   my_oprator[i],\
                                   my_oprator[j],\
                                   my_oprator[k]);
                //判斷結(jié)果是否為目標(biāo)點(diǎn)數(shù),精度0.000001
                if(ret - TARGET_POINT <= 0.000001 &&\
                        ret - TARGET_POINT >= -0.000001)
                {
                    printf("%.0f%c(%.0f%c(%.0f%c%.0f))=%.0f\n",\
                           a, my_oprator[i],\
                           b, my_oprator[j],\
                           c, my_oprator[k], d, ret);
                    flag = 1; //成功匹配
                }

                //表達(dá)式5:(A#B)#(C#D)
                ret = Expression_5(a, b, c, d,\
                                   my_oprator[i],\
                                   my_oprator[j],\
                                   my_oprator[k]);
                //判斷結(jié)果是否為目標(biāo)點(diǎn)數(shù),精度0.000001
                if(ret - TARGET_POINT <= 0.000001 &&\
                        ret - TARGET_POINT >= -0.000001)
                {
                    printf("(%.0f%c%.0f)%c(%.0f%c%.0f)=%.0f\n",\
                           a, my_oprator[i],\
                           b, my_oprator[j],\
                           c, my_oprator[k], d, ret);
                    flag = 1; //成功匹配
                }
            }
    if(flag == 0)
        printf("沒有滿足條件的表達(dá)式\n");
    return 0;
}

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

由于是根據(jù)括號(hào)位置分類的,所以有些式子在某種意義上是相同的,比如1*((2*3)*4) , 1*(2*(3*4)) 和 (1*2)*(3*4),但是如果要對(duì)這個(gè)進(jìn)行優(yōu)化(去掉無(wú)效括號(hào)),感覺還挺復(fù)雜的。

到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言24點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++歸并排序算法實(shí)例

    C++歸并排序算法實(shí)例

    這篇文章主要介紹了C++歸并排序算法實(shí)例,本文先是介紹了什么是歸并排序,然后給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • 詳解C語(yǔ)言之預(yù)處理(上)

    詳解C語(yǔ)言之預(yù)處理(上)

    這篇文章主要介紹了C語(yǔ)言程序的預(yù)處理,小編覺得這篇文章寫的還不錯(cuò),需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C語(yǔ)言結(jié)構(gòu)體(struct)的詳細(xì)講解

    C語(yǔ)言結(jié)構(gòu)體(struct)的詳細(xì)講解

    C語(yǔ)言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • C++11 std::shared_ptr總結(jié)與使用示例代碼詳解

    C++11 std::shared_ptr總結(jié)與使用示例代碼詳解

    這篇文章主要介紹了C++11 std::shared_ptr總結(jié)與使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • C++ Vector用法深入剖析

    C++ Vector用法深入剖析

    C++ Vector應(yīng)用方式是比較特殊的,我們將會(huì)在這篇文章中針對(duì)于它的應(yīng)用方式進(jìn)行一個(gè)詳細(xì)的介紹,希望大家能充分掌握這一應(yīng)用技巧
    2014-08-08
  • C語(yǔ)言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比

    C語(yǔ)言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比

    這篇文章主要介紹了C語(yǔ)言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比,分別用于讀取組格式函數(shù)和讀取密碼格式,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言背包問(wèn)題求解全過(guò)程(貪心方法)

    C語(yǔ)言背包問(wèn)題求解全過(guò)程(貪心方法)

    背包問(wèn)題是一個(gè)經(jīng)典的動(dòng)態(tài)規(guī)劃問(wèn)題,而貪心算法是一種常用的解決背包問(wèn)題的方法,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言背包問(wèn)題求解(貪心方法)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 詳解C++虛函數(shù)表存儲(chǔ)位置

    詳解C++虛函數(shù)表存儲(chǔ)位置

    相信大家知道虛表指針和虛函數(shù)存儲(chǔ)的位置,但對(duì)于虛函數(shù)表的存儲(chǔ)位置一時(shí)無(wú)法確定。本文就來(lái)和大家詳細(xì)聊聊相關(guān)內(nèi)容,希望對(duì)大家有所幫助
    2023-04-04
  • 手拉手教你如何理解c/c++中的指針

    手拉手教你如何理解c/c++中的指針

    當(dāng)你對(duì)C越來(lái)越熟悉時(shí),你會(huì)發(fā)現(xiàn)把與指針攪和在一起的"類型"這個(gè)概念分成"指針的類型"和"指針?biāo)赶虻念愋?quot;兩個(gè)概念,是精通指針的關(guān)鍵點(diǎn)之一,這篇文章主要給大家介紹了關(guān)于c/c++中指針的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用

    C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用

    本篇文章主要包括內(nèi)聯(lián)函數(shù)和auto關(guān)鍵字。其中,內(nèi)斂函數(shù)包括概念,特性等;auto關(guān)鍵字的使用規(guī)則,使用場(chǎng)景等,接下來(lái)讓我們深入了解
    2022-05-05

最新評(píng)論

利辛县| 突泉县| 新源县| 错那县| 谷城县| 嘉义县| 柯坪县| 宁波市| 大城县| 民勤县| 朝阳区| 霸州市| 龙口市| 蓬安县| 镇雄县| 沂南县| 焦作市| 龙陵县| 平湖市| 三江| 通许县| 全州县| 金坛市| 齐齐哈尔市| 迭部县| 佛冈县| 临颍县| 绥滨县| 罗城| 祁门县| 五台县| 安宁市| 潜江市| 仪陇县| 明星| 独山县| 耿马| 余庆县| 新昌县| 永宁县| 报价|