EXCEL有點深度的問題

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

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

更新2:

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

更新3:

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

更新4:

再次感謝各位大大的熱心解答,小弟收穫不少,目前回答部份僅W大提供解答,但因發問時間即將屆滿,若諸位大大沒有意見,小弟將在今晚11點30分選為最佳解答(夏日大及新田美香大若發表答案,因超出小弟能力範圍,故將交付投票)。 另新田美香大may0905版本著實讓小弟吃驚萬分(因在其EXCEL配置細膩,已超出小弟發問範圍,但其設計竟是小弟實際問題),在此再次感謝各位大大解決小弟的問題,謝謝。

回答 (4)

2009-09-06 8:56 am
✔ 最佳答案
以快速而言, 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

在此說明的是 :
此解為基礎形式,
用的是 "遍歷, 全掃" 方式 ~
因為全掃,
所以比起 美香大 提供網址上的範例是遠不如的 ~
(全部用到數學 ~ )

但使用數學最少, 而應用範圍最廣 !!
2009-09-06 6:35 am
看了幾位大大的做法, 除了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大的新載點有問題, 可否重新上傳
2009-09-04 8:17 am
上百個數字, 可能有數萬個組合
版大還是先學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大
2009-09-04 7:11 am
有趣的題目,之前解過類似的,此題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兄要提供遞迴 的寫法請指教了。


收錄日期: 2021-04-27 16:59:30
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20090903000010KK05931

檢視 Wayback Machine 備份