我想請問一下..要怎麼讓程式算出 s=§4 4 5 5 6 6§這個集合,可以組合出數字合為15的情況有幾種?
正確答案是"8"種
以下是所有組合情況
456
456
456
456
456
456
456
456
也就是說只要位置不同,就算數字重複了也算是新的一種組合
2005-11-03 09:37:14 · 5 個解答 · 發問者 包哲豪 2 in 電腦與網際網路 ➔ 程式設計
我想用遞回的寫法..因為集合裡面的數字可能因為使用者的輸入不同而數量有所不同
2005-11-03 10:24:29 · update #1
我有種想法...其實你只是不知道會有多少字吧!
len(text1) 就能解決
mid(text1,n,m) 抓字
之後利用 for i = n to m 這樣方式去跑
用條件句去紀錄幾比
應該就解決哩...另外這應該是排列組合的問題
唸:C N 取 M 沒計錯的話 有點小數學問題
2005-11-03 12:54:07 · answer #1 · answered by 小毛 5 · 0⤊ 0⤋
Dim Str As String, Add As Integer, S() As String, Y() As Integer
Private Sub Command1_Click()
Str = "445566"
Add = 15
RaArr 1
End Sub
Sub RaArr(L As Integer)
Dim I As Integer
ReDim S(L): ReDim Y(L)
For I = 0 To L
S(I) = Str
Y(I) = 1 + I
Next
RaCal
If L < Len(Str) - 1 Then
L = L + 1
RaArr L
End If
End Sub
Sub RaCal()
Dim I As Integer, S1 As String, T As Integer, R As Integer, U As Integer
U = UBound(S)
Do
S1 = "": T = 0
For I = 0 To U
T = T + Val(Mid(S(I), Y(I), 1))
If T > Add Then Exit For
S1 = S1 & Mid(S(I), Y(I), 1)
Next
If T = Add Then
If Len(S1) = U + 1 Then Print S1
End If
If I > U Then I = U
For R = I To 0 Step -1
If Y(R) < Len(S(R)) Then
Y(R) = Y(R) + 1
Exit For
End If
Next
If R < 0 Then Exit Sub
For I = R + 1 To U
Y(I) = Y(I - 1) + 1
Next
Loop
End Sub
我的做法:
445566先算兩個字的組合,先產生2個陣列
陣列一S(0) 4 4 5 5 6 6
陣列二S(1) 4 4 5 5 6 6
陣列一是從第1個字開始Y(0)=1,陣列二第2個字開始Y(1)=2
Y(0)=1 : Y(1)=2→44
Y(0)=1 : Y(1)=3→45
Y(0)=1 : Y(1)=4→45
Y(0)=1 : Y(1)=5→46
Y(0)=1 : Y(1)=6→46
Y(1)已經到S(1)的最後1字,Y(0)=Y(0)+1,Y(1)=Y(0)+1
Y(0)=2 : Y(1)=3→45
Y(0)=2 : Y(1)=4→45
Y(0)=2 : Y(1)=5→46
Y(0)=2 : Y(1)=6→46
.
.
.
一直判別到Y(0)=5 : Y(1)=6後再產生3個陣列(3個字的組合),直到6個字的組合都完成為止.我的文筆很差希望月大您看得懂!!
------------------------
修改了一下RaCal副函數,使用Do~Loop取代遞迴免得造成堆疊空間不足!!
2005-11-09 16:28:10 補充:
月大您的功力比我強多了
2005-11-07 17:43:25 · answer #2 · answered by W.J.S. 7 · 0⤊ 0⤋
小毛,
不適合用一個字一個字讀入的方式
萬一數字是兩位數咧?你不就開始頭疼?
若是負數咧?你不就呆在那裡?
一開始,遊戲規則要訂好
像這題,就很明顯沒訂好
沒制訂好的規則,永遠都會有BUG出現
2005-11-04 04:14:28 · answer #3 · answered by Anonymous · 0⤊ 0⤋
回小毛大~
光是for i = n to m是寫不出來的
再想一下會比較好喔
回ㄆㄆ偉大~
把字串的位置用數字表示
{445566} 分別用123456來代替他的位置
ex1:123不合 因為 445和為13
ex2:146合 因為 456和為15
正題:
135
136
145
146
235
236
245
246
就是這八組
你說的不只八種
是還把得到的數字做排列了吧 @@
135變531如果這樣當然不只八種
但是依包子大的題義
沒有要做排序的變換
所以只有八組是對的
2005-11-04 09:09:52 補充:
遞迴的話要先歸納出你判斷的程序
4(向後方累加)
44(向後方累加)
445(向後方累加)
4455(大於15)
4456(大於15)
4456(大於15,已讀到最末位)
445(向後方累加)
4456(大於15)
4456(大於15,已讀到最末位)
446(向後方累加)
4466(大於15)
446(向後方累加)
45(向後方累加)
455(向後方累加)
4556(大於15)
4556(大於15,已讀到最末位)
456(印)
456(印)
45(向後方累加)
456(印)
456(印)
46(向後方累加)
466(大於15,已讀到最末位)
46(向後方累加,已讀到最末位)
4(向後方累加)
45(向後方累加)
455(向後方累加)
4556(大於15)
4556(大於15,已讀到最末位)
456(印)
456(印)
45(向後方累加)
456(印)
456(印)
46(向後方累加)
466(大於15,已讀到最末位)
46(向後方累加)
5(向後方累加)
55(向後方累加)
556(大於15)
556(大於15,已讀到最末位)
56(向後方累加)
566(大於15,已讀到最末位)
56(向後方累加)
5(向後方累加)
56(向後方累加)
566(大於15,已讀到最末位)
56(向後方累加,已讀到最末位)
6(向後方累加)
66(向後方累加,已讀到最末位)
6(向後方累加,已讀到最末位)
程式結束
先讓你想一下
這樣的判斷序要怎麼去歸納
瞭解的話
遞迴的雛形就差不多了 ^^
'==========
感謝 W.J.S.大的回應 ^^
底下是我的做法,參考一下吧 ^^
P.s.: W.J.S.大~你程式修完快多了喔 ^^
Private Sub Command1_Click()
Dim mString As String
Call AA(Text1.Text, mString, 0, Val(Text2.Text))
End Sub
Private Sub Form_Load()
Text1.Text = "445566"
Text2.Text = 15
End Sub
Private Sub AA(ByRef Word As String, ByRef mString As String, ByVal Deep As Integer, ByRef MaxNum As Integer)
For i = Deep + 1 To Len(Word)
mString = mString + Mid$(Word, i, 1)
If ST(mString) = MaxNum Then
Print mString
End If
If ST(mString) <= MaxNum Then
Call AA(Word, mString, i, MaxNum)
mString = Left(mString, Len(mString) - 1)
Else
mString = Left(mString, Len(mString) - 1)
Exit Sub
End If
Next i
End Sub
Function ST(Word As String) As Integer
For i = 1 To Len(Word)
ST = ST + Val(Mid$(Word, i, 1))
Next i
End Function
2005-11-04 09:50:41 補充:
沒錯........
就是無限深度迴圈
換一個說法
就是遞迴 ~"~
2005-11-04 10:26:25 補充:
無限深度迴圈:
先把你的迴圈深度設為可變動陣列a
產生另一個可變動二維陣列b用來紀錄每一層的啟始 終值 和STEP值
先把陣列a初始化(把啟始值讀進陣列a)
DO
陣列a的數字開始累加陣列b對應的step值
如果數字超出陣列b對應終值就把下一個陣列a的值+陣列b對應的step值
如果代表最表層的陣列a已經超出陣列b對應終值就Exit Do
陣列a的各元素即為你的現在迴圈值(a(0)a(1)a(2)a(3)a(4))
LOOP
遞迴:
不知道該怎麼解釋
總之是自己呼叫自己 XD
2005-11-08 09:22:38 補充:
W.J.S.大~
可以解說一下你的寫法嗎?
繞到頭暈還是不太懂你在寫什麼
2005-11-09 23:41:01 補充:
W.J.S.大 讚謬了
看過你的寫法和想法讓我獲益良多 ^^
2005-11-04 04:09:52 · answer #4 · answered by ? 5 · 0⤊ 0⤋
如果說位置不同,就算數字重複了也算是新的一種組合 那因該不只8種巴
2005-11-04 09:31:53 補充:
那如果有好幾個數字那回圈要怎設阿?
是不是又關西到無線回圈哩
月島大大說一下逼
2005-11-04 09:58:34 補充:
月島大大可不可以把那個無線深度回圈
再拿來說明一下 kukka大大的說明跟程式混在一起 我看不太董ㄟ
謝
2005-11-03 14:15:15 · answer #5 · answered by Anonymous · 0⤊ 0⤋