问题是这样的:有N个字母,按每S个分组,可以有多少种不同的组合?(不分前后顺序) 
例如:
ABCDEF 有六个字母 按每4个分为一组可以得到:ABCD;ABCE;ABCF;ABDE;ABDF
ACDE;ACDF;ACEF;ADEF;BCDE;BCDF;
BDEF;CDEF共13种组合。(不知道上面有没有排列错掉)N和S是未知数。想了好几个晚上也没有想出来。

解决方案 »

  1.   

    把ABCDEF都取出 按一个一个字母设为数组x(N)
    s=""
    for i= x(1) to x(N)
        s=s+i
        for i1=去除第一个后的x(1)-x(N)
            s=s+i1
            for iN=去除第N个后的x(1)-x(n)
              s=s+iN
              ....
              ....
             
        next
        
    next
      

  2.   

    Sub GETALL(ByVal num As Integer, ByRef x As Variant, ByRef RESULT() As String, Optional ByRef all As Long)Dim A() As String, b() As Integer '临时数组
    Dim n As Integer ' 数组元素个数
    Dim i As Long '循环变量
    Dim TEMP As Long '二进制转换中间变量
    Dim num2 As Integer '中间计数变量
    n = UBound(x) - LBound(x) + 1 '数组元素个数
    If num > n Then MsgBox "ERR!", vbInformation, "WARNING": Exit Sub
    ReDim b(0 To n - 1)
    all = 0
    For i = 0 To 2 ^ n - 1 '循环
    TEMP = i
    num2 = 0
    For j = 0 To n - 1 '转换为二进制
    b(j) = TEMP And 1 '0 or 1
    TEMP = TEMP \ 2
    If b(j) = 1 Then
    num2 = num2 + 1
    ReDim Preserve A(1 To num2)
    A(num2) = x(LBound(x) + j)
    End If
    Next
    If num2 = num Then
    all = all + 1
    ReDim Preserve RESULT(1 To all)
    RESULT(all) = Join(A, "")   '结果保存
    Debug.Print RESULT(all) '输出
    End If
    Next
    Debug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"
    End SubPrivate Sub Command1_Click()
    Dim x, i As Integer
    Dim out() As String
    x = Array("A", "B", "C", "D", "E", "F")
    GETALL 4, x, out
    End Sub
    输出:ABCD
    ABCE
    ABDE
    ACDE
    BCDE
    ABCF
    ABDF
    ACDF
    BCDF
    ABEF
    ACEF
    BCEF
    ADEF
    BDEF
    CDEF
    从 6 个元素的数组中选 4 个元素, 共 15种组合!
    参看拙作:http://blog.csdn.net/northwolves/archive/2004/07/25/51090.aspx
      

  3.   

    n
    Cm=m*(m-1)*....*(M-n+1)/n!
    高中的数学啊。
      

  4.   

    用这种算法不可取:原因Sub GETALL(ByVal num As Integer, ByRef x As Variant, ByRef RESULT() As String, Optional ByRef all As Long)Dim A() As String, b() As Integer '临时数组
    Dim n As Integer ' 数组元素个数
    Dim i As Long '循环变量
    Dim TEMP As Long '二进制转换中间变量
    Dim num2 As Integer '中间计数变量
    n = UBound(x) - LBound(x) + 1 '数组元素个数
    If num > n Then MsgBox "ERR!", vbInformation, "WARNING": Exit Sub
    ReDim b(0 To n - 1)
    all = 0
    For i = 0 To 2 ^ n - 1 '  当n>32时i的值会溢出!TEMP = i
    num2 = 0
    For j = 0 To n - 1 '转换为二进制
    b(j) = TEMP And 1 '0 or 1
    TEMP = TEMP \ 2
    If b(j) = 1 Then
    num2 = num2 + 1
    ReDim Preserve A(1 To num2)
    A(num2) = x(LBound(x) + j)
    End If
    Next
    If num2 = num Then
    all = all + 1
    ReDim Preserve RESULT(1 To all)
    RESULT(all) = Join(A, "")   '结果保存
    Debug.Print RESULT(all) '输出
    End If
    Next
    Debug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"
    End SubPrivate Sub Command1_Click()
    Dim x, i As Integer
    Dim out() As String
    x = Array("A", "B", "C", "D", "E", "F")
    GETALL 4, x, out
    End Sub当n>32时i的值会溢出!
      

  5.   

    //当n>32时i的值会溢出!溢出你就换一个数据类型,还有,你的字母数有上限吗?