福利彩票和體育彩票近兩年比較火暴,相應在vb論壇上大家討論也較多。其實選擇彩票與集合選擇子集相同道理。下面給出一種vb的遞迴演算法(雖然明知存入陣列會加快運算速度,但最終也沒能滿意地實現,請大家多多指教。另外,效率確實不高)
option explicit
private sub command1_click()
dim temp, i as long, starttime as long, endtime as long
starttime = timer
temp = cmn(22, 6)
endtime = timer
open "d:\mofn.txt" for binary as #1 '寫入檔案
put #1, , temp
close #1
msgbox ubound(split(temp, vbcrlf)) + 1 & " 種組合", 64, "共用時 " & endtime - starttime & " 秒" '計算組合可能情況和耗時
end sub
function cmn(byval m as integer, byval n as integer) as string ' select n number from 1~m
dim a() as string, temp as string, i as long
redim a(1 to m) '定義陣列
for i = 1 to m
a(i) = i
next
if m = 3 then
if n = 1 then cmn = 1 & vbcrlf & 2 & vbcrlf & 3
if n = 2 then cmn = "1,2" & vbcrlf & "1,3" & vbcrlf & "2,3"
if n = 3 then cmn = "1,2,3"
elseif m > 3 then
if n = 1 then cmn = join(a, vbcrlf)
if n = m then cmn = join(a, ",")
if n > 1 and n < m then
temp = cmn(m - 1, n - 1)
'debug.print m - 1 & "," & n - 1 & vbcrlf & "----------------" & vbcrlf & temp & vbcrlf & "---------------------------" & vbcrlf '可以在立即視窗檢視演算法過程
temp = replace(temp, vbcrlf, "," & m & vbcrlf) & "," & m
cmn = cmn(m - 1, n) & vbcrlf & temp
end if
end if
end function
下面給出利用集合實現不重複隨機選取某幾個號碼,這個函式也可用來實現陣列全部元素的隨機排列。
function getone(byval m as integer, byval n as integer) as string ' one random option to select n number from 1~m without repeat number
dim a() as string, temp as new collection, i as long, tempi as long
redim a(1 to n) '定義陣列
for i = 1 to m
temp.add i '可以根據需要更改
next
randomize
for i = 1 to n
tempi = int(rnd * temp.count) + 1
a(i) = temp(tempi)
temp.remove tempi
next
getone = join(a, ",")
set temp = nothing
erase a
end function
private sub command2_click()'演示用法
msgbox getone(30, 8), 64, "30選8 的一種選法"
msgbox getone(100, 100), 64, "1 到100 的一種不重複全排列"
end sub
遞迴列印組合
列印組合問題 給出數n和k 1 k n 求出c n,m 的所有組合並列印.例如n 5,k 3,則所有的組合為 5 4 3 5 4 2 5 4 1 5 3 2 5 3 1 5 2 1 4 3 2 4 3 1 4 2 1 3 2 1 如果只是求出組合數,那麼就是簡單的 單向遞迴 問題,因為存在遞推公式 ...
組合與全排列非遞迴演算法
組合與全排列非遞迴演算法 浩天 二進位制組合演算法 思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同...
排列與組合的Java遞迴實現
我們在筆試面試過程中經常會遇到關於排列與組合的問題,其實這些可以通過遞迴簡單的實現,看下面兩個例子 1 關於字串排列的問題 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。可以這樣想 固...