|
发表于 2014-2-15 18:54
|
显示全部楼层
本楼为最佳答案
本帖最后由 香川群子 于 2014-2-15 19:17 编辑
- Dim sj&(), sj2$(), jc&(), jg$(), c&, m1&, n1&, m2&, n2&, k&, cnt&, tms#, cnt2&
- Sub kagawa()
- tms = Timer
- [a1].CurrentRegion.Offset(1) = ""
-
- m1 = 9: n1 = 3
- k = Application.Combin(m1, n1) 'k=84
- ReDim sj&(1 To k, 1 To n1) 'Get Combin(9,3)
- ReDim sj2$(1 To k) 'Get Combin(9,3)
- k = 0: Call dgZH1("", 0, 1)
-
- ReDim jc&(1 To m1)
-
- m2 = k: n2 = 6: c = 2
- k = Application.Combin(m2, n2) 'k=406,481,544
- cnt = 10 ^ 4: ReDim jg$(1 To cnt, 1 To 1)
- k = 1: Call dgZH2("", 0, 1) 'k=122,220
-
- Cells(Cells.Rows.Count, 1).End(3).Offset(1).Resize(k - 1) = jg
- MsgBox Format(Timer - tms, "0.000s ") & Format([a1].End(4).Row - 1, "#,##0")
-
- End Sub
- Sub dgZH1(s$, i&, t&)
- Dim j&, l&
- For j = i + 1 To m1 - n1 + t
- If t = n1 Then
- k = k + 1
- For l = 1 To n1 - 1
- sj(k, l) = Mid(s, l, 1)
- Next
- sj(k, n1) = j
- sj2(k) = s & j
- Else
- Call dgZH1(s & j, j, t + 1)
- End If
- Next
- End Sub
- Sub dgZH2(s$, i&, t&)
- Dim j&, l&
- ' cnt2 = cnt2 + 1 '1,474,590
-
- For j = i + 1 To m2 - n2 + t
- For l = 1 To n1
- If jc(sj(j, l)) = c Then Exit For
- Next
-
- If l = n1 + 1 Then
- If t = n2 Then
- jg(k, 1) = Mid(s, 2) & " " & sj2(j)
- If k = cnt Then
- Cells(Cells.Rows.Count, 1).End(3).Offset(1).Resize(cnt) = jg
- Application.StatusBar = Format([a1].End(4).Row - 1, "#,##0") & Format(Timer - tms, " 0.000s ") & s & sj2(j)
- k = 1
- Else
- k = k + 1
- End If
- Else
- For l = 1 To n1
- jc(sj(j, l)) = jc(sj(j, l)) + 1
- Next
-
- Call dgZH2(s & " " & sj2(j), j, t + 1)
-
- For l = 1 To n1
- jc(sj(j, l)) = jc(sj(j, l)) - 1
- Next
- End If
- End If
- Next
- End Sub
复制代码
六码组合kagawa.rar
(19.24 KB, 下载次数: 23)
|
|