当前位置:编程学习 > VB >>

求m选n的vb组合算法,最好不是递归实现

求m选n的vb算法,最好不是递归实现,大量数据递归的运算vb里效率相当的低,用来做彩票选号程序,每个结果按照从小到大排列,希望高手指点,结贴即给分! --------------------编程问答-------------------- 这个不需要递归的。
直接排列组合就可以了。 --------------------编程问答-------------------- 求具体的代码,谢谢 --------------------编程问答-------------------- 不客气 --------------------编程问答-------------------- 才10分还一上来就要代码。。无语。。 --------------------编程问答--------------------
引用 3 楼 citybird 的回复:
不客气

--------------------编程问答-------------------- 用N层循环~~~ --------------------编程问答--------------------  这是我以前在广州做的 36选7 南粤风彩 其实,你只要选不重复的随机数即可, 何必要去搞算法 ?





--------------------编程问答-------------------- 大量数据是因为你把开奖记录搞在一起弄得太复杂了!
先不说递归 客户机子稍不好的都会拖累程序
1、压缩下源数据
2、可以使用有自动排列功能的控件 --------------------编程问答-------------------- 没有找到合适的方法,我还是采取循环的方式输出所有组合,m,n没有做成输入参数,直接在循环中指定了,看到一位朋友写的 逐个移位的算法,自己试了一下,未果,望高人能出现 --------------------编程问答--------------------
引用 7 楼 cbm666 的回复:
这是我以前在广州做的 36选7 南粤风彩 其实,你只要选不重复的随机数即可, 何必要去搞算法 ?


我要的是输出所有的组合,之前做过一个跟你说的一样也是用随机数,指定返回结果,但不方便统计和筛选 --------------------编程问答-------------------- 提供一个思路,还可以优化...速度不是VB所长,数据过大快不了....

Option Explicit

'获得组合总数
 Private Function Total(ByVal m As Long, ByVal n As Long) As Long
    Dim i As Long
    Dim Result As Double
    Result = 1
    For i = n To 1 Step -1
        Result = Result * m / i
        m = m - 1
    Next
    Total = Result
End Function

'单个组合
Private Sub CarryComb(CombItem As Variant, pComp() As Long, n As Long)
    Dim i As Long
    i = n
    While CombItem(i) = pComp(i)
        i = i - 1
    Wend
    CombItem(i) = CombItem(i) + 1
    While i < n
        i = i + 1
        CombItem(i) = CombItem(i - 1) + 1
    Wend
End Sub

'组合结果
Private Sub CombResult(m As Long, n As Long, Result As Variant)
    
    Dim i As Long, j As Long
    Dim Num As Long
    
    If n > m Then Exit Sub
    
    ReDim CombItem(1 To n)
    ReDim pComp(1 To n) As Long
    
    Num = m - n
    For i = 1 To n - 1
        CombItem(i) = i
        pComp(i) = Num + i
    Next
    CombItem(n) = n - 1
    pComp(n) = m
    
    Num = Total(m, n)   ': Debug.Print Num
    ReDim Result(1 To Num)
    For i = 1 To Num
        CarryComb CombItem, pComp, n
        Result(i) = Join(CombItem)
        'DoEvents
    Next
    
End Sub


Private Sub Command1_Click()
    
    Dim m As Long, n As Long
    Dim myResult

    m = 35
    n = 5
    Call CombResult(m, n, myResult)
    Debug.Print Join(myResult, vbCrLf)
    
End Sub

补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,