匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 1 0 年前

印出大樂透全部的號碼(Java,C,C++)

想好幾天(急)

失眠好幾天

49個號碼選六個,輸出到檔案和螢幕

可以講解一下程式碼嗎,我怎麼那麼笨都想不出快沒信心了

有人教我僅存的20點奉上

已更新項目:

謝謝不過不是隨機的,是全部的,如 1 2 3 4中挑兩個是

12 13 14 23 24 34 共六個輸出至檔案和螢幕上

23 個解答

評分
  • 1 0 年前
    最佳解答

    ㄜ~為什麼老師都喜歡出樂透的題目?

    2010-02-03 19:45:37 補充:

    用簡單遞迴法~從1開始

    每個數字可選擇挑和不挑

    假設我挑1,那再遞迴呼叫列印函式,列印所有"包含"1的樂透號碼(剩5碼)

    假設不挑1,那再遞迴呼叫列印函式,列印所有"不包含"1的樂透號碼(剩6碼)

    #include <cstdlib>

    #include <iostream>

    #include <fstream>

    #include <vector>

    using namespace std;

    //大樂透共49個號碼,一組6個數字

    enum { TOTAL_NUMS = 49 , ONE_NUMS = 6 };

    //列印一組樂透號碼

    void printOneCandidateNum(vector<int> &candidateNum, ostream &os=cout);

    //列印全部樂透號碼

    void printAllCandidateNum(const vector<int> &sample, vector<int> &candidateNum, int targetIndex=0);

    int main(int argc, char *argv[])

    {

    //資料準備 1~49

    int array [TOTAL_NUMS];

    for(int index=0; index<TOTAL_NUMS; ++index)

    {

    array[index] = index+1;

    }

    {

    vector<int> sample( array, array + TOTAL_NUMS);

    vector<int> candidateNum;

    //開始列印

    printAllCandidateNum(sample, candidateNum);

    }

    system("PAUSE");

    return EXIT_SUCCESS;

    }

    //實作碼列於下

    void printOneCandidateNum(vector<int> &candidateNum, ostream &os)

    {

    typedef vector<int>::iterator Iterator;

    os << "{ ";

    for(Iterator it=candidateNum.begin(); it!=candidateNum.end(); ++it)

    {

    os << *it << ' ';

    }

    os << '}' << endl;

    }

    void printAllCandidateNum(const vector<int> &sample, vector<int> &candidateNum, int targetIndex)

    {

    //遞迴中止條件1,若湊足六個號碼便印出

    if( candidateNum.size() == ONE_NUMS )

    {

    static ofstream ofile("c:\\1.txt");//假設有這個檔案

    printOneCandidateNum( candidateNum, ofile);//輸出到檔案

    printOneCandidateNum( candidateNum);//輸出到螢幕

    return;

    }

    //遞迴中止條件2,超出49個號碼,無望,當然直接返回

    if( targetIndex >= TOTAL_NUMS )

    return;

    {

    //若有挑選sample[targetIndex]這個號碼....則加入這個號碼,

    //並呼叫更特化的遞迴函式

    candidateNum.push_back( sample[targetIndex] );

    printAllCandidateNum(sample, candidateNum, targetIndex+1);

    //若沒有挑選sample[targetIndex]這個號碼....則刪除這個號碼,

    //並呼叫更特化的函式

    candidateNum.pop_back();

    printAllCandidateNum(sample, candidateNum, targetIndex+1);

    }

    }

    在AMD 7750上大概要跑一個半小時~~

    本來以為用遞迴應該會stack overflow,

    但沒想到記憶體消耗卻意外的少,果然直覺是不靈的

    因為怕stack overflow,所以想把程式碼展開,

    利用樣版自動inline並展開程式碼,茲補充列於下~看看就好

    2010-02-03 19:48:43 補充:

    printAllCandidateNum的原型宣告太長被切掉

    故補於下

    void printAllCandidateNum

    (const vector &sample, vector &candidateNum, int targetIndex=0);

    2010-02-03 19:50:24 補充:

    inline版如下

    2010-02-03 19:50:31 補充:

    #include

    #include

    #include

    #include

    using namespace std;

    //大樂透有49個號碼, 一期6個數字

    enum { TOTAL_NUMS = 49 , ONE_NUMS = 6 };

    //欲輸出的檔案資料流

    ofstream ofile("c:\\1.txt");

    2010-02-03 19:50:54 補充:

    #include < cstdlib >

    #include < iostream >

    #include < fstream >

    #include < vector >

    using namespace std;

    //大樂透有49個號碼, 一期6個數字

    enum { TOTAL_NUMS = 49 , ONE_NUMS = 6 };

    //欲輸出的檔案資料流

    ofstream ofile("c:\\1.txt");

    2010-02-03 19:52:33 補充:

    //將一組樂透號碼印出的函式

    void printOneCandidateNum(vector< int > &candidateNum, ostream &os=cout)

    {

    typedef vector< int >::iterator Iterator;

    os << "{ ";

    for(Iterator it=candidateNum.begin(); it!=candidateNum.end(); ++it)

    {

    os << *it << ' ';

    }

    os << '}' << endl;

    }

    2010-02-03 19:54:23 補充:

    //列印用主模版,預設含一go函式,可列印出大樂透所有的排列組合

    template< int targetIndex=0, int numberSize=0 >

    class PrintAllCandidateNum;

    2010-02-03 19:54:58 補充:

    //特化模版,若targetIndex等於49,代表49個號碼已挑選完了,直接返回

    //TOTAL_NUMS是49

    template< int numberSize >

    class PrintAllCandidateNum< TOTAL_NUMS, numberSize >{

    public:

    static inline void go(const vector< int > &sample, vector< int > &candidateNum)

    {

    return;

    }

    };

    2010-02-03 19:56:07 補充:

    //如果有六組號組號碼的話,就可以印出啦

    //ONE_NUMS是6

    2010-02-03 19:57:07 補充:

    template< int targetIndex >

    class PrintAllCandidateNum< targetIndex, ONE_NUMS >{

    public:

    static inline void go(const vector< int > &sample, vector< int > &candidate)

    {

    printOneCandidateNum( candidate, ofile);

    printOneCandidateNum( candidate);

    return;

    }

    };

    2010-02-03 19:58:13 補充:

    //避免< 49,6 >這種模擬兩可的情況出現

    2010-02-03 19:58:24 補充:

    template<>

    class PrintAllCandidateNum< TOTAL_NUMS, ONE_NUMS >{

    public:

    static inline void go(const vector< int > &sample, vector< int > &candidate)

    {

    printOneCandidateNum( candidate, ofile);

    printOneCandidateNum( candidate);

    return;

    }

    };

    2010-02-03 19:59:22 補充:

    //遞迴主模版

    template< int targetIndex, int numberSize >

    class PrintAllCandidateNum{

    public:

    static inline void go(const vector< int > &sample, vector< int > &candidateNum)

    {

    2010-02-03 19:59:30 補充:

    //遞迴分支

    //如果有選取 sample[targetIndex] 的號碼的話

    //將sample[targetIndex] 加入本組號碼

    //並再呼叫較為特化的遞迴函式

    candidateNum.push_back( sample[targetIndex] );

    PrintAllCandidateNum< targetIndex+1, numberSize+1 >::go(sample,candidateNum);

    2010-02-03 19:59:58 補充:

    //如果沒有選取sample[targetIndex] 的號碼的話

    //將本組號碼取消

    //並再呼叫較為特化的遞迴函式

    candidateNum.pop_back();

    PrintAllCandidateNum< targetIndex+1, numberSize >::go(sample,candidateNum);

    }

    };

    2010-02-03 20:00:35 補充:

    int main(int argc, char *argv[])

    {

    int array [TOTAL_NUMS];

    for(int index=0; index < TOTAL_NUMS; ++index)

    {

    array[index] = index+1;

    }

    2010-02-03 20:02:14 補充:

    {

    vector< int > sample( array, array + TOTAL_NUMS);

    vector< int > candidateNum;

    //開始列印

    PrintAllCandidateNum< >::go(sample,candidateNum);

    }

    system("PAUSE");

    return EXIT_SUCCESS;

    }

    2010-02-03 20:05:09 補充:

    因為只要模版引數稍有不同,就是不同的函式,所以就不算遞迴~

    ~順利的話,有些程式碼可以在編譯期inline展開

    2010-02-04 10:08:29 補充:

    嗯嗯~納魯紅豆~遞迴樹深度啊~

    ㄜ~家裡又在吵架~我心慌慌

    2010-02-04 14:55:33 補充:

    我是遜咖,只想快點把作業交給老師~然後去玩XD

    2010-02-08 01:22:08 補充:

    經測試~大部份的時間都花在中控台輸出

    如果只輸出到檔案~倒是不用一分鐘

    如果只在記憶體中計算,也是數十秒~

    如果採用C的輸出入函式~應該可以改善一下

    不過一分鐘的話~我想助教應該不會和我這個門外漢太計較吧?

    勉強交了吧~~~

  • 5 年前

    一次購買可線上收看或下載珍藏,一部片只要25元。每日更新強檔好片,畫質佳http://941hdav.com.tw//葛格,人家等你好久了!推薦你免費視訊,就是想讓你看個夠...

  • 6 年前

    * 九州娛樂 http://*****

    [電子遊戲]

    拉霸、水果盤、7PK、5PK

    [運彩遊戲]

    棒球、籃球、足球、網球、冰球、各種體育經典賽事

    [真人遊戲]

    百家樂、21點、骰寶、輪盤、牌九、三公、輪盤、翻攤、牛牛、二八杠

    [對戰遊戲]

    台灣麻將、德州撲克、骰盅吹牛、四支刀、鬥地主、十三支、二八槓、暗棋、接龍

    [彩球遊戲]

    香港六合、台灣樂透、今彩539、樂合彩、大陸時時彩、基諾彩、北京賽車、賽狗、賽馬、指數

    [優惠活動]

    1. 新舊會員儲值就送500點

    2. 真人百家樂彩金等你拿

    九州娛樂 http://*****

    歡迎免費體驗試玩!!

  • 6 年前

    * 九州娛樂 http://*****

    [電子遊戲]

    拉霸、水果盤、7PK、5PK

    [運彩遊戲]

    棒球、籃球、足球、網球、冰球、各種體育經典賽事

    [真人遊戲]

    百家樂、21點、骰寶、輪盤、牌九、三公、輪盤、翻攤、牛牛、二八杠

    [對戰遊戲]

    台灣麻將、德州撲克、骰盅吹牛、四支刀、鬥地主、十三支、二八槓、暗棋、接龍

    [彩球遊戲]

    香港六合、台灣樂透、今彩539、樂合彩、大陸時時彩、基諾彩、北京賽車、賽狗、賽馬、指數

    [優惠活動]

    1. 新舊會員儲值就送500點

    2. 真人百家樂彩金等你拿

    九州娛樂 http://*****

    歡迎免費體驗試玩!!

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 匿名使用者
    6 年前

    推薦給你純手工製作黑糖薑母茶,薑母茶網站

    食安問題 嚴格把關

    專利手作薑母茶無防腐劑香精滿滿薑片親手現熬

    黑糖薑母茶,嚴選食材台灣製造,手工製作

    雅虎關鍵字搜尋:[ 暖暖純手作 ] 網址: www.黑糖薑母茶.com

    純手工,黑糖薑母茶,純手工黑糖薑母茶,純手工黑糖薑母茶,薑茶,

    純手工黑糖薑母茶,黑糖,薑母茶,黑糖薑母茶,純手作黑糖薑母茶,薑母,

    黑糖薑母茶-薑母茶-黑糖-黑糖薑母茶-黑糖薑母茶-薑母茶-黑糖-黑糖薑母茶-

    黑糖薑母茶-薑母

    若有打擾之處,敬請見諒,在這跟您說聲抱歉

  • 匿名使用者
    6 年前

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

    【 最新活動→迎接新會員,首存狂送20% 】

    【運動→電子→對戰→現場→彩球 】

    【免費服務 →電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服 】

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

  • 匿名使用者
    6 年前

    ●運動 - NBA、MLB、日本職棒、中華職棒、冰球、足球、網球、彩球、拳擊、賽馬

    ●現場 - 百家樂、龍虎、21點、輪盤、手臂、番攤、牛牛、骰寶、牌九

    ●對戰 - 麻將、暗棋、軍棋、吹牛、十三支、德州撲克、大老二、鬥地主、妞妞、接龍

    ●電子 - 水果盤、中國美人、極限飆速、趙雲救主、西遊記、金瓶梅、英雄、7PK、5PK

    ●彩球 - 大樂透、今彩、BingoBingo、Keno、北京賽車、六合彩

    ●免費服務 - 電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服

    ●●● 精彩無限、 免費體驗 官網 AA8888點NET ●●●

  • 匿名使用者
    7 年前

    瞭解一次、多一次的保障。尋找八大行業工作。必須謹慎小心一點。

    小巴常說:保險跟冒險只差一個字,意義卻是大不同!

    一通電話、一次詢問。都是為自己的著想。

  • 匿名使用者
    7 年前

    瞭解一次、多一次的保障。尋找八大行業工作。必須謹慎小心一點。

    小巴常說:保險跟冒險只差一個字,意義卻是大不同!

    一通電話、一次詢問。都是為自己的著想。

  • novus
    Lv 6
    1 0 年前

    空氣的第一個寫法不至於stack overflow的原因很簡單

    因為 stack 消耗量只和遞迴深度有關,而這個做法雖然搜尋空間很大,但是遞迴很淺

    至於這個問題其實有更簡單的做法,搞得太複雜反而速度不高

    2010-02-05 11:41:08 補充:

    我對一個半小時這個時間也頗好奇

    剛試了一下,不論用遞迴或迴圈,在CPU只有 1.4GHz 的筆電上都只花數十秒而已。

    (趕快交作業就沒事了嗎?我之前看念研究所當助教的朋友改程式作業,執行時間遠超乎想像的程式,很可能會被誤以為是程式當掉而草率給0分。)

還有問題?馬上發問,尋求解答。