EXCEL有點深度的問題

我有一組數字(可能有上百個)如1,2,3,4,5,6,7,8,9,10,另外我有一個答案(這裡假設數字相加後為19),,不一定是幾個數字相加哦,可能2個,可能3個或更多個,每一種組合我都要。有辦法利的EXCEL內的函數或VB來快速找出答案嗎?

Update:

對不起,我的意思是,我有一堆數字,其中某幾個數字相加的和是我已知的,我想求出到底是哪些數字加出來的,例如我有數字1,2,3,4我已知數字相加和是5,那我就會有2組解(1,4or2,3),可是如果我數字是千位數以上而且有十幾個,那我就沒辦法用人工判斷了,所以才須要用excel或者vb來做

Update 2:

怎麼會是意見的夏日大跟新田美香大的答案才是我要的呢,敏仔大大要加油哦,既然您回答了,我還是很期待您的答案哩^^

Update 3:

夏日大大,小弟目前並無上百組數字可供參考,只是小弟想要更有彈性而已,不過新田美香大說的沒錯,我的功力還不夠,應該還是從基礎學起才是。但是既然您都已經寫好了,希望不吝分享,供小弟參考參考。也謝謝worlonzeng大提供的意見,待小弟消化後再來試看看。另外各位都發在意見實在令小弟為難丫

Update 4:

再次感謝各位大大的熱心解答,小弟收穫不少,目前回答部份僅W大提供解答,但因發問時間即將屆滿,若諸位大大沒有意見,小弟將在今晚11點30分選為最佳解答(夏日大及新田美香大若發表答案,因超出小弟能力範圍,故將交付投票)。

另新田美香大may0905版本著實讓小弟吃驚萬分(因在其EXCEL配置細膩,已超出小弟發問範圍,但其設計竟是小弟實際問題),在此再次感謝各位大大解決小弟的問題,謝謝。

4 Answers

Rating
  • Anonymous
    1 decade ago
    Favorite Answer

    以快速而言, N層 FOR 的寫法是最快的 ~

    (如美香大的寫法)

    但彈性較低 ~

    2009-09-04 12:21:19 補充:

    不才提供三種寫法參考 :

    1. N 層 FOR

    2. For i = 1 to 2^N

    3. 遞迴

    2009-09-04 18:04:20 補充:

    "第四種算法"

    耶 ~

    這不才可有興趣了 ~

    未知是何種算法呢 ?

    2009-09-04 18:09:18 補充:

    猜猜看 :

    do loop 嗎 ?

    2009-09-04 19:51:49 補充:

    應該不是 ~

    個人以為 vb 應該沒法,

    for i = 1 to 2^100 就跑到暈了 ~

    不然就得加些數學吧 !?

    學海無涯, 以有涯隨無涯, 累 !!

    呵呵 ~

    2009-09-04 22:40:02 補充:

    非質疑, 愚意是 :

    應該非單純 vb 功能,

    (掛了啥或呼叫了啥 ~ )

    (低階語言速度快 ! )

    或者是用了數學當工具 ~

    (這或許更有可能 ... 只是我還須思考 ~ )

    2009-09-04 22:40:07 補充:

    因為空的 100 層 FOR i = 1 to 2 的時間,

    與空的 For i = 1 to 2^100 的時間大致是一樣的 ~

    vb 連跑空的 For i = 1 to 2^N 都不知要跑多久了 ~

    2009-09-04 22:55:55 補充:

    遞迴這兩天會寫完再 po 上,

    給興趣的大大參考 ~

    ^ ^

    2009-09-05 01:58:54 補充:

    "去除枉跑"

    這就是數學 ~

    ^^

    它只跑局部區塊, 一些細節得細思 ~

    2009-09-05 02:03:51 補充:

    但該類解法個人不認為是通解 ~

    (可說是妙解, 靠的是數學, 邏輯, 才能定義出可免的區塊 ~ )

    (限制也大 ... )

    2009-09-05 13:38:22 補充:

    要先說的是 : 遞迴一樣是遍歷的作法,

    它的速度應該跟N層for一樣 ~

    如果要去除枉跑, 要靠數學, 要加入判斷, 不必要的迴圈不跑 ~

    屬於變化, 不屬於基本解法 ~

    2009-09-05 14:03:51 補充:

    http://www.FunP.Net/301880

    FOR I = 1 to 2^N 敝解 ~

    除了程式碼看起來條理外, 無啥特點 ~

    ^ ^

    2009-09-05 22:29:05 補充:

    如有負數, 此行需蓋掉 :

    If vT > v0 Then GoTo Nx

    可以有勞美香大給沒找到的範例嗎 ? 較快 ~

    如有, 應該是變數型態的問題吧 ?

    2009-09-05 23:33:31 補充:

    1. 此與排序不同 ~

    2. 2^N 問題確實在此(變數有其大小限制), 所以可考慮用 "遞迴" ~

    3. 此類題型之 "數字題" , 可能會有數學方式, 結果如 夏日兄 所提到的高速處理,

    但當延伸至文字時, 則無迂迴之路 ~

    4. "數值一多時, 就成龜速"

    為何現在密碼愈規定愈多字, 還需特殊符號,

    這不是沒理由的 ~ 講的是同件事 ~

    "無迂迴之路"

    2009-09-06 00:38:11 補充:

    更正 018

    遞迴快頗多, 我也在想為什麼

    >.<

    稍作檢查後再貼 ~

    2009-09-06 00:56:14 補充:

    遞迴解 : http://www.FunP.Net/986175

    程式碼 :

    Dim Mx, MxO() As String, CntMxO As Long

    Sub Recur()

    Dim Tm As Single: Tm = Timer

    CntMxO = 0

    Mx = Sheet1.[A1].CurrentRegion.Columns(1)

    Dim CntMx As Byte: CntMx = UBound(Mx, 1)

    Dim vTarget As Single: vTarget = Sheet1.[C1]

    Dim vTmp As Single

    Sheet1.[D:D].Clear

    RCyc 1, CntMx, vTarget, vTmp

    [D1].Resize(CntMxO, 1).Value = Application.Transpose(MxO)

    [C5] = Timer - Tm

    MsgBox CntMxO & "解", , "WLZ"

    End Sub

    Function RCyc(SN As Byte, CntMx As Byte, vTarget As Single, vTmp As Single, Optional StrTmp As String)

    If SN > CntMx Then

    If vTmp = vTarget Then

    CntMxO = CntMxO + 1

    ReDim Preserve MxO(1 To CntMxO) As String

    MxO(CntMxO) = StrTmp

    End If

    Else

    RCyc SN + 1, CntMx, vTarget, vTmp, StrTmp

    RCyc SN + 1, CntMx, vTarget, vTmp + Mx(SN, 1), StrTmp & "+" & Mx(SN, 1)

    End If

    End Function

    ---

    有疑問請再提出討論 ~

    2009-09-06 15:14:07 補充:

    運用於小數時, 請將 :

    If vTmp = vTarget Then

    改為 :

    If Abs(vTmp - vTarget) < 0.0001 Then

    此為變數型態問題 ~

    2009-09-06 15:25:15 補充:

    也適用於小數的版本 :

    http://www.FunP.Net/865936

    更動 :

    1. If vTmp = vTarget Then >>> If Abs(vTmp - vTarget) < 0.00001 Then

    2. 變數型態 : single >>> double

    2009-09-06 15:33:15 補充:

    輸出文字檔會更快

    redim preserve 速度跟 collection 速度差不多, 都是算慢的 ~

    2009-09-06 22:46:20 補充:

    http://www.FunP.Net/394135

    在此說明的是 :

    此解為基礎形式,

    用的是 "遍歷, 全掃" 方式 ~

    因為全掃,

    所以比起 美香大 提供網址上的範例是遠不如的 ~

    (全部用到數學 ~ )

    但使用數學最少, 而應用範圍最廣 !!

    • Login to reply the answers
  • Daniel
    Lv 7
    1 decade ago

    看了幾位大大的做法, 除了N層FOR以外, 都是以 FOR I = 1 to 2^N 敝解, 但試過後發現, 如超過30個數值以上, 即會產生錯誤, 是否有更好的方式以解超過30個數

    另外, 如果數值少時, 執行時間很快, 數值一多時, 就成龜速, 甚至於當掉, 這讓我想起與陣列排序的 Bubble Sort 方法的結果相似, 且將數值轉為二進位後的程式碼還有些許的雷同

    2009-09-05 22:35:15 補充:

    個人所知, 尚有 Quick Sort 及 Counting Sort 的排序法, 或許, 用這兩種排序法加以修改, 應該可以解決速度的問題, 但小弟一直都改不出來

    以上個人淺見, 希望對此題有幫助, 也請各位大大集思廣義, 做出更棒的方法給大家分享

    2009-09-06 22:15:47 補充:

    W大的新載點有問題, 可否重新上傳

    • Login to reply the answers
  • 1 decade ago

    上百個數字, 可能有數萬個組合

    版大還是先學10個數字

    此類問題, 懂vba是必要條件, 建議初學者用10個二進制循環求解(除了窮舉外, 此法應最笨, 但容易吸收 ), 待較成熟時, 再考慮其他更有效及快速的思路和更優化的代碼, 否則難以消化或虛不受補

    http://www.funp.net/425324

    2009-09-05 01:29:09 補充:

    此類題目, 以前祇寫過n個for, 今次首次編寫 for i = 1 to 2^n

    希望沒有出錯

    http://www.funp.net/125428

    2009-09-05 01:46:06 補充:

    以前曾看過一些VBA高手的遞迥, 看到幾十代的子子孫孫在程序中出出入入, 心寒眼花頭暈, 個人程度是無法獨立編寫遞迥, 希望能早日看到W大的佳作。個人認為, 如要跑得快, 最重要是避免枉跑, 此點遞迥應是最佳方法, 如將數字從小至大排序, 更可大幅度去除枉跑, 將結果導入txt.檔, 則是錦上添花, 大大節省輸入時間。個人感覺, 難有數學方法。

    2009-09-05 14:54:20 補充:

    W大019附件, 經測試, 發覺如遇小數, 經常少了多組, 未知是什麼原因

    2009-09-06 15:00:27 補充:

    剛才隨機模擬了一些數據, W大意見區及答題區都是跑出4組, 而實際應是17組, 請看附件:

    http://www.funp.net/523315

    2009-09-06 15:22:01 補充:

    另夏兄所說的極速VBA, 我亦曾在某大陸論壇見識過, 但並不通用。限制條件是 數據是連續的自然數, 如 1~100的 100個數字, 不重複且排順序, 相同步長。幾十萬數據輸入excel的時間比跑巨集的時間還要長。由於論壇規定, 不容轉載, 如有興趣, 可link 至

    http://club.excelhome.net/thread-151178-1-1.html

    過客可看內容, 如要下載附件, 先要註冊

    我在excelhome現時的排名是602, 級數相當低

    2009-09-06 22:06:40 補充:

    經測試, W大原版, 運算小數值的過程中, 應是有浮點精確度的bug, 修改代碼後, 運作正常。

    好東西, 當然收藏, 學習, "無迂迴之路" 更是此類難題的金句, 謝謝W大

    • Login to reply the answers
  • 夏日
    Lv 5
    1 decade ago

    有趣的題目,之前解過類似的,此題29種解。

    期待其他高手解題。

    2009-09-04 09:42:07 補充:

    你把你說的近上百組的數字加要求的和上傳一份,我來跑跑看再說。

    2009-09-04 16:31:16 補充:

    用的是2. For i = 1 to 2^N的方法

    http://www.FunP.Net/487335

    我寫的此法不是很快。

    見過第四種算法,100筆數據求總合,求出44.4萬組解輸出至txt檔在我電腦上跑7.5秒,但被加密了excel寫的,我的電腦不快單核amd3000+電腦。

    遞迴應該速度會比我上面寫的快(但ram不能太小)。

    2009-09-04 22:22:22 補充:

    我上面有寫了原excel被加密了,所以不知道怎麼算的,但他的算法絕對比N 層 FOR的速度快。

    For i = 1 to 2^N是我之前寫的,如果w兄要提供遞迴 的寫法請指教了。

    • Login to reply the answers
Still have questions? Get your answers by asking now.