今彩 539 6取5包牌-比對中獎號碼
商科競賽題目:今彩 539 是一種樂透型遊戲,投注者必須從 01~39 的號碼中任選 5 個不同的號碼進行投注。 開獎時,開獎單位將隨機開出五個號碼,這一組號碼就是該期今彩 539 的中獎號碼,也稱為 「獎號」。投注者的五個選號中,如有二個以上(含二個號碼)對中當期開出之五個中獎號碼, 即為中獎。
為了方便包牌,投注者可任選 6 個不同號碼,共可以產生 6 組不同的 5 個號碼組合。用程式 計算投注者任選的 6 個不同號碼的包牌的組合,各對中 2 碼(對中當期獎號之其中任二碼)、3 碼、4 碼及 5 碼的次數。
輸入說明: 第一列的數字n代表有幾組資料要測試, 。第二列為該期今彩539的中獎號碼(獎號), 已由小到大排序好。第三列起為測試資料,每組測試資料為一列,有 6 個數字,是投注者任 選的 6 個不同號碼,各個號碼間以“,”隔開,已由小到大排序好。
輸出說明: 計算每組測試資料中,獎號和投注者的 6 個號碼,用程式計算投注者任選的 6 個不同號碼所 組合的 6 種不同投注,對中 2 碼(對中當期獎號之其中任二碼) 、3 碼、4 碼及 5 碼各中幾次, 各個對中次數間以“,”隔開,且輸出順序依規定。
例如今彩 539 的中獎號碼為 01,07,28,29,30:投注者任選的 6 個不同號碼為 01,07,29,30,36,39 6 種不同投注為:(底線是為了方便比對中獎號碼) 07,29,30,36,39 對中 3 碼 01,29,30,36,39 對中 3 碼 01,07,30,36,39 對中 3 碼 01,07,29,36,39 對中 3 碼 01,07,29,30,39 對中 4 碼 01,07,29,30,36 對中 4 碼 在這 6 個不同號碼對中 2 碼 0 次;3 碼 4 次;4 碼 2 次;5 碼 0 次;則輸出 0,4,2,0。
輸入檔案 1:【檔名:in1.txt】 2 01,07,28,29,30 01,07,29,30,36,39 01,07,22,23,24,38
輸入檔案 2:【檔名:in2.txt】 2 21,22,23,24,32 01,02,03,04,05,06 21,22,23,24,25,32
輸出範例:【檔名:out.txt】 0,4,2,0 4,0,0,0 0,0,0,0 0,0,5,1
程式解說:
Dim m, n
Dim ans '以上為全域變數
Dim target = "01,07,28,29,30" '中獎號碼 ' "21,22,23,24,32"
Dim chnumb = "01,07,22,23,24,38" '6取5的6個號碼 '"01,07,29,30,36,39" ' "01,02,03,04,05,06"
' Dim tarray = Split(target, ",")' 中獎號碼切割放入陣列中
Dim charray = Split(chnumb, ",")'6取5的6個號碼放入陣列中
Dim numb(5) As Integer
m = 6
n = 5
com(1, 1, "")
Sub com(ByVal i, ByVal layers, ByVal s)'遞迴6取5函數
If layers <= n Then '未進入第5層必須進入下一層
For j = i To m - n + layers
' s = s & j
com(j + 1, layers + 1, s & j)'每一層起點是上一層的+1終點是m-n+layers ,s+j是各層出的組合值
Next
Else
ans = ans & s & "/" '裝入變數ans
End If
End Sub
'產生陣列的索引值
Dim st = ""
Dim ansarray = Split(ans, "/")
For i = 0 To UBound(ansarray) - 1
Dim dg = ansarray(i)'5個索引值
For j = 1 To Len(dg)
Dim g = Mid(dg, j, 1)
st = st & charray(g - 1) & "/" '產生5個號碼放入變數st
Next
' MsgBox(st)
Dim co = compare(st, target) '中幾個號碼
numb(co) += 1 '索引值為對幾次2表示對中2個號碼-則加1
st = ""
Next
Dim targetans = ""
For i = 2 To 5
targetans = targetans & numb(i) & "," '中2 3 4 5個號碼次數用變數串起
Next
MsgBox(targetans)
Function compare(ByVal s1, ByVal s2) '比較中獎號碼s2函數
Dim g = Split(s1, "/")
Dim nu = 0
For i = 0 To UBound(g) - 1
Dim a = g(i)
If InStr(s2, a) <> 0 Then nu += 1' 每一個號碼有在中獎號碼中則加1
Next
Return nu
End Function
影音解說
為了方便包牌,投注者可任選 6 個不同號碼,共可以產生 6 組不同的 5 個號碼組合。用程式 計算投注者任選的 6 個不同號碼的包牌的組合,各對中 2 碼(對中當期獎號之其中任二碼)、3 碼、4 碼及 5 碼的次數。
輸入說明: 第一列的數字n代表有幾組資料要測試, 。第二列為該期今彩539的中獎號碼(獎號), 已由小到大排序好。第三列起為測試資料,每組測試資料為一列,有 6 個數字,是投注者任 選的 6 個不同號碼,各個號碼間以“,”隔開,已由小到大排序好。
輸出說明: 計算每組測試資料中,獎號和投注者的 6 個號碼,用程式計算投注者任選的 6 個不同號碼所 組合的 6 種不同投注,對中 2 碼(對中當期獎號之其中任二碼) 、3 碼、4 碼及 5 碼各中幾次, 各個對中次數間以“,”隔開,且輸出順序依規定。
例如今彩 539 的中獎號碼為 01,07,28,29,30:投注者任選的 6 個不同號碼為 01,07,29,30,36,39 6 種不同投注為:(底線是為了方便比對中獎號碼) 07,29,30,36,39 對中 3 碼 01,29,30,36,39 對中 3 碼 01,07,30,36,39 對中 3 碼 01,07,29,36,39 對中 3 碼 01,07,29,30,39 對中 4 碼 01,07,29,30,36 對中 4 碼 在這 6 個不同號碼對中 2 碼 0 次;3 碼 4 次;4 碼 2 次;5 碼 0 次;則輸出 0,4,2,0。
輸入檔案 1:【檔名:in1.txt】 2 01,07,28,29,30 01,07,29,30,36,39 01,07,22,23,24,38
輸入檔案 2:【檔名:in2.txt】 2 21,22,23,24,32 01,02,03,04,05,06 21,22,23,24,25,32
輸出範例:【檔名:out.txt】 0,4,2,0 4,0,0,0 0,0,0,0 0,0,5,1
程式解說:
Dim m, n
Dim ans '以上為全域變數
Dim target = "01,07,28,29,30" '中獎號碼 ' "21,22,23,24,32"
Dim chnumb = "01,07,22,23,24,38" '6取5的6個號碼 '"01,07,29,30,36,39" ' "01,02,03,04,05,06"
' Dim tarray = Split(target, ",")' 中獎號碼切割放入陣列中
Dim charray = Split(chnumb, ",")'6取5的6個號碼放入陣列中
Dim numb(5) As Integer
m = 6
n = 5
com(1, 1, "")
Sub com(ByVal i, ByVal layers, ByVal s)'遞迴6取5函數
If layers <= n Then '未進入第5層必須進入下一層
For j = i To m - n + layers
' s = s & j
com(j + 1, layers + 1, s & j)'每一層起點是上一層的+1終點是m-n+layers ,s+j是各層出的組合值
Next
Else
ans = ans & s & "/" '裝入變數ans
End If
End Sub
'產生陣列的索引值
Dim st = ""
Dim ansarray = Split(ans, "/")
For i = 0 To UBound(ansarray) - 1
Dim dg = ansarray(i)'5個索引值
For j = 1 To Len(dg)
Dim g = Mid(dg, j, 1)
st = st & charray(g - 1) & "/" '產生5個號碼放入變數st
Next
' MsgBox(st)
Dim co = compare(st, target) '中幾個號碼
numb(co) += 1 '索引值為對幾次2表示對中2個號碼-則加1
st = ""
Next
Dim targetans = ""
For i = 2 To 5
targetans = targetans & numb(i) & "," '中2 3 4 5個號碼次數用變數串起
Next
MsgBox(targetans)
Function compare(ByVal s1, ByVal s2) '比較中獎號碼s2函數
Dim g = Split(s1, "/")
Dim nu = 0
For i = 0 To UBound(g) - 1
Dim a = g(i)
If InStr(s2, a) <> 0 Then nu += 1' 每一個號碼有在中獎號碼中則加1
Next
Return nu
End Function
影音解說
留言
張貼留言