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

c++回溯法解決1到9之間插入加減或空使運(yùn)算結(jié)果為100

 更新時(shí)間:2021年10月12日 14:53:13   作者:zjuPeco  
編寫(xiě)一個(gè)在1,2,…,9(順序不能變)數(shù)字之間插入+或-或什么都不插入,使得計(jì)算結(jié)果總是100的程序,并輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100

問(wèn)題分析

這時(shí)我最近偶然看到的一道題目,發(fā)現(xiàn)實(shí)現(xiàn)起來(lái)還確實(shí)有些麻煩,所以把實(shí)現(xiàn)的過(guò)程記錄下來(lái)。
這種要羅列出所有結(jié)果的問(wèn)題,我一般是采用回溯法解決的,說(shuō)的通俗一點(diǎn)就是暴力解法,去遍歷所有的情況。
這個(gè)問(wèn)題有一點(diǎn)比較難處理的地方就在于有這個(gè)“什么都不插入”這個(gè)選項(xiàng),所以干脆單獨(dú)拎出來(lái)解決。也就是先把1-9這9個(gè)數(shù)組相互組合,形成一個(gè)數(shù)組,比如:

{1,2,3,4,5,6,7,8,9}
{1,2,3,4,5,6,7,89}
{1,2,3,4,5,6,78,9}
{1,2,3,4,5,6,789}
...

在分組的過(guò)程當(dāng)中,由于問(wèn)題的特殊性(要求結(jié)果為100),我們會(huì)發(fā)現(xiàn)像

{123456,789}

這樣位數(shù)特別大的是不可能得到100這樣的結(jié)果的,一個(gè)最小的6位數(shù)和一個(gè)最大的3位數(shù)的差都有

100000−999=99001

所以本問(wèn)題中不用考慮把1-9劃分成6位數(shù)及以上的情況。
將1-9劃分好之后,接下來(lái)要做的就是把”+”和”-“填到劃分的數(shù)字之間了,比如

劃分成{1,2,3,4,5,6,7,8,9}時(shí)有:
1+2+3+4+5+6+7+8+9
1+2+3+4+5+6+7+8-9
1+2+3+4+5+6+7-8+9
...
劃分成{1,2,3,4,5,6,7,89}時(shí)有:
1+2+3+4+5+6+7+89
1+2+3+4+5+6+7-89
...

其他情況就不列舉了,相信應(yīng)該看明白了

基于這樣的思路,用C++對(duì)該想法進(jìn)行了實(shí)現(xiàn)。

代碼展示

下面程序可以將結(jié)果100改成其他的整數(shù),都是適用的。

#include <iostream>
#include <math.h>
#include <vector>
#include <string>
using namespace std;
class Solution{
private:
    vector<string> res;
    vector<int> nums;
    vector<int> eles;
private:
    void _compute(vector<int> vec, int index, int target, string &s){
        if (index == vec.size()){
            if (0 == target)
                res.push_back(s + "=100");
            return;
        }
        //分“+”和“-”兩種情況討論
        for (int i = 0; i < 2; i++){
            if (i == 0){
                string tempStr = s + "+" + to_string(vec[index]);
                _compute(vec, index + 1, target - vec[index], tempStr);
            }
            else if (i == 1){
                string tempStr = s + "-" + to_string(vec[index]);
                _compute(vec, index + 1, target + vec[index], tempStr);
            }
        }
        return;
    }

    //用來(lái)得到1-9的不同整數(shù)組合,比如{123, 456, 789},本質(zhì)是將“”這個(gè)空符號(hào)加入到數(shù)之間
    void _recursion(int index, int target){
        if (index == 9){
            string s = to_string(eles[0]);
            _compute(eles, 1, target - eles[0], s);
            return;
        }

        //為了問(wèn)題的泛化采用i <= 9,如果針對(duì)結(jié)果為100的可以改成i <= 5
        for (int i = 1; i <= 9; i++){
            if (index + i > 9)
                break;
            int temp = 0;

            //求得分解出來(lái)的每個(gè)元素的值
            for (int j = 0; j < i; j++){
                temp += nums[index + j] * pow(10, i - j - 1);
            }
            eles.push_back(temp);
            _recursion(index + i, target);
            eles.pop_back();
        }
        return;
    }

public:
    Solution(){
        nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    }

    vector<string> recursion(int index, int target){
        _recursion(index, target);
        return res;
    }
};

int main()
{
    Solution s;
    vector<string> res = s.recursion(0, 100);
    cout << "共有" << res.size() << "種情況" << endl;
    for (string s : res){
        cout << s << endl;
    }
    return 0;
}

以上就是c++回溯法解決1-9之間插入加減或空使運(yùn)算結(jié)果為100的詳細(xì)內(nèi)容,更多關(guān)于c++回溯法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c語(yǔ)言結(jié)構(gòu)體字節(jié)對(duì)齊的實(shí)現(xiàn)方法

    c語(yǔ)言結(jié)構(gòu)體字節(jié)對(duì)齊的實(shí)現(xiàn)方法

    在c語(yǔ)言的結(jié)構(gòu)體里面一般會(huì)按照某種規(guī)則去進(jìn)行字節(jié)對(duì)齊。本文就來(lái)介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解下
    2021-07-07
  • C語(yǔ)言進(jìn)階:指針的進(jìn)階(5)

    C語(yǔ)言進(jìn)階:指針的進(jìn)階(5)

    這篇文章主要介紹了C語(yǔ)言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下
    2021-09-09
  • EasyC++單獨(dú)編譯

    EasyC++單獨(dú)編譯

    這篇文章主要介紹了EasyC++單獨(dú)編譯,在上一篇當(dāng)中,我們編寫(xiě)好了頭文件coordin.h,現(xiàn)在我們要完成它的實(shí)現(xiàn)。需要的小伙伴可以先學(xué)習(xí)上一篇內(nèi)容然后一起與小編一起進(jìn)入本篇內(nèi)容一起學(xué)習(xí)吧
    2021-12-12
  • C++如何用智能指針管理內(nèi)存資源

    C++如何用智能指針管理內(nèi)存資源

    這篇文章主要介紹了C++如何用智能指針管理內(nèi)存資源,幫助大家更好的理解和使用c++開(kāi)發(fā),感興趣的朋友可以了解下
    2020-08-08
  • 在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼

    在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼

    最近的項(xiàng)目在用c處理后臺(tái)的數(shù)據(jù)時(shí),因?yàn)楹枚嗤獠拷涌诙荚谑褂肑son格式作為返回的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)描述,如何在c中高效使用和處理Json格式的數(shù)據(jù)就成為了必須要解決的問(wèn)題,需要的朋友可以參考下
    2023-11-11
  • c++基礎(chǔ)使用STL的注意點(diǎn)詳解

    c++基礎(chǔ)使用STL的注意點(diǎn)詳解

    這篇文章主要為大家介紹了c++基礎(chǔ)使用STL的注意點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++實(shí)現(xiàn)圖書(shū)館系統(tǒng)

    C++實(shí)現(xiàn)圖書(shū)館系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)館系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng)

    C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • .h和.cpp文件的區(qū)別(zt)詳細(xì)介紹

    .h和.cpp文件的區(qū)別(zt)詳細(xì)介紹

    特別是對(duì)源文件和頭文件的概念,需要深入對(duì)它了解,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-11-11
  • Opencv圖像處理之輪廓外背景顏色改變

    Opencv圖像處理之輪廓外背景顏色改變

    這篇文章主要為大家詳細(xì)介紹了Opencv圖像處理之輪廓外背景顏色改變,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論

瓦房店市| 家居| 屯门区| 大兴区| 平泉县| 房产| 仁布县| 桦南县| 镇坪县| 海晏县| 金湖县| 云龙县| 稷山县| 福州市| 泰宁县| 南宫市| 富宁县| 龙口市| 邮箱| 灯塔市| 南皮县| 芒康县| 伊宁县| 西畴县| 辽中县| 兰坪| 新兴县| 诸城市| 两当县| 宜昌市| 林西县| 武穴市| 阜南县| 宽甸| 灵武市| 双流县| 麦盖提县| 宁强县| 金寨县| 东辽县| 崇仁县|