內容 : 正體->简体
為了呼應台灣電腦彩券的發行,我們再次推出跟組合有關的題目。你在買彩券的時候一定會挑你喜歡的數字吧!(雖然理論上不會增加你的中獎機率,但是你還是會 選擇你的Lucky Number)我們的問題是:假設共有49個號碼,而你必須在你的 k (k>6)個Lucky Number中挑6個號碼作為一張彩券的數字組合。例如:你的Lucky Number的集合是{1,2,3,5,8,13,21,34}以就是說 k=8 ,那麼你就有C(8,6)=28種可能的彩券組合:
[1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34].
你的任務是讀入k以及Lucky Number的集合,然後輸出所有可能的組合。
輸入說明 :
每筆測試資料一行,每行的第1個整數代表 k( 6 < k < 1 3 ) 。 接下來的k個整數代表Lucky Number的集合,此集合已經按數字由小到大排好。k=0代表輸入結束。
輸出說明 :
對每一筆測試資料,輸出其所有可能的組合,每個組合一行。請注意輸出組合的順序需由小到大排列。測試資料之間請空一行。請參考Sample Output。
範例輸入 :
7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0
範例輸出 :
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34
排序後放入list1
回覆刪除Dim Y() As String
Private Sub Form_Load()
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do
Input #1, N
If N = 0 Then Exit Do
Line Input #1, X
List1.Clear
Y = Split(X)
For i = (N - 2) To 1 Step -1
For j = 0 To i
If Val(Y(j)) > Val(Y(j + 1)) Then
temp = Y(j)
Y(j) = Y(j + 1)
Y(j + 1) = temp
End If
Next
Next
For i = 0 To UBound(Y)
List1.AddItem Y(i)
Next i
Call ABC("", 0, 0)
Print #2, " "
Loop Until N = 0
Close #2
Close #1
End
End Sub
Sub ABC(ByVal A, ByVal B, ByVal C)
If C = 6 Then
Print #2, A
Else
For i = B To UBound(Y)
If C < 6 Then Call ABC(A & " " & List1.List(i), i + 1, C + 1)
Next i
End If
End Sub
佑好,
回覆刪除程式正確。
改進點:
Input #1, N
If N = 0 Then Exit Do
Line Input #1, X
同一行裡,先輸入1 個,再輸入其它的,會不會有些不確定性呢。
還不如就
Line Input #1, X
If X = 0 Then
Exit Do
else
才去split
Dim s, nu
回覆刪除Private Sub Form_Load()
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do While Not EOF(1)
Line Input #1, n
s = Split(n)
Call Lot(0, "")
Loop
Close
Close
End Sub
Sub Lot(a, ans)
If a = 6 Then
Call fin(ans)
Else
For i = 1 To s(0)
If InStr(ans, s(i)) = 0 Then Call Lot(a + 1, ans & " " & s(i))
Next
End If
End Sub
Sub fin(a)
Dim m, k
m = Split(a)
k = 1
For i = UBound(m) To 1 Step -1
If Val(m(i)) < Val(m(i - 1)) Then k = 0
Next
If k = 1 Then Print #2, a
End Sub