vb 按降序输出组合C(m,n)问题
vb吧
全部回复
仅看楼主
level 1
jjqadd 楼主
按以下代码能输出比如6个数的全组合降序格式,但是脚标不对,请高手帮忙改改,多谢!需求如下图:
Private Sub f(m As Integer, p As Long) '自定义过程求阶乘
Dim i As Integer
p = 1
For i = 1 To m '求m的阶乘
p = p * i
Next i
End Sub
Private Sub Command1_Click() '求组合
Dim m As Integer
Dim n As Integer
Dim c As Long
Dim f1 As Long
Dim j, k, g, h, l, y, h1 As Integer
Dim a(1 To 1000) As String, b(1 To 1000) As String
Set xlApp = CreateObject("ket.Application")
'If Dir(App.Path & "\" & "excel.bz") = "" Then '判断EXCEL是否打开
Set xlApp = CreateObject("Excel.Application") '创建EXCEL应用类
xlApp.Visible = True '显示WPS界面
Set xlBook = xlApp.Workbooks.Open(App.Path & "\" & "排列组合.xls") '打开EXCEL工作簿
Set xlsheet = xlBook.Worksheets(1) '打开EXCEL工作表
m = 6 '取C(m,n)值
g = 0
l = m
y = 0
For n = 1 To 6 '有多少个数参与组合,n的最大值为6
Call f(m, f1) '调用子过程求m的阶乘
c = f1 '结果赋给c
Call f(n, f1) '求n的阶乘
c = c / f1 '结果赋给c
Call f(m - n, f1) '求m-n的阶乘
c = c / f1 '组合数结果赋给c(6,1)=6,c(6,2)=15,c(6,3)=20,c(6,4)=15,c(6,5)=6,c(6,6)=1
If n > 1 Then
c = g + c
End If
For j = g + 1 To c 'g为前一个组合的数量,c为当前n的最大组合数即:行数,j为行数
For k = 1 To n 'k为列数,n是几就是几列
For h = l To n Step -1
For y = n To 1 Step -1
If y = c Then
a(h) = "a" & m
End If
Next y
a(h) = "a" & h
Exit For
Next h
If h <= 0 Then
h = m
l = m
End If
xlsheet.Cells(j, k) = a(h) '输出值
l = l - 1
Next k
Next j
g = j - 1
Next n
End Sub
2023年05月21日 03点05分 1
level 15
你这是在循环输出6、5、4、3、2、1啊

正确的
做法应该是:比如C(6,2),第一行先输出a6和a5,然后从第二行开始,直接把前一行的内容抄下来,再把最后一格的数减1,其余不动;如果最后一格已经是1了,就减前一格,前一格是2了就减再前一格……
2023年05月21日 04点05分 2
感谢你的解答,规律是这样的,但我没写出来[汗]
2023年05月21日 05点05分
level 15
以下代码在VBA中运行通过
Dim m As Integer, n As Integer
Dim i As Integer, j As Integer, k As Integer
Dim a() As Integer '用数组保存每一行的数
m = 6
For n = 1 To m
ReDim a(1 To n)
'第一行
j = j + 1
For k = 1 To n
a(k) = m + 1 - k
Cells(j, k) = "a" & a(k) 'Cells相当于你的VB代码中的xlsheet.Cells,下同
Next k
'其余各行
For i = 2 To Application.WorksheetFunction.Combin(m, n) 'Excel自带组合数函数,直接调用了,VB中也可以这样,Application对应你代码中的xlApp
j = j + 1
For k = n To 1 Step -1 '循环查找需要减1的数字位置
If a(k) > n + 1 - k Then Exit For '符合该条件即为找到了,退出循环
Next k
a(k) = a(k) - 1 '找到的k位置数字减1
For k = k + 1 To n
a(k) = a(k - 1) - 1 '后续数字再重新初始化
Next k
For k = 1 To n
Cells(j, k) = "a" & a(k)
Next k
Next i
Next n
2023年05月21日 09点05分 3
哇!试了,真的可以,大佬牛批!代码比我这些乱七八糟的清晰!感谢老师[大拇指]
2023年05月21日 09点05分
1