A组:A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12
B组:B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12
C组:C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12
以上3组共36个数字全部由数字1至X中取值(35<X<40);且互不相等
这三组数一定有N种排列的,VB中解决?有没有什么代码?
B组:B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12
C组:C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12
以上3组共36个数字全部由数字1至X中取值(35<X<40);且互不相等
这三组数一定有N种排列的,VB中解决?有没有什么代码?
Dim x() As String
Dim i As Integer, j As Integer, Num As Long
Dim a() As Integer '记载数组下标
Dim b() As Integer '记载使用标识ReDim x(1 To n)
For i = 1 To n
x(i) = Right("00" & i, 2)
NextReDim a(1 To n)
ReDim b(1 To n)
i = 1
a(1) = 0
Num = 1
Do While i <= n
a(i) = a(i) + 1
If a(i) <= n Then
If b(a(i)) = 0 Then
If i = n Then '达到数组末,则输出组合情况
Debug.Print Num & ":"
For j = 0 To 35
Debug.Print Chr(j \ 12 + 65) & j Mod 12 + 1 & "=" & x(a(j + 1)) & " "; '输出
If j Mod 12 = 11 Then Debug.Print
Next
Debug.Print
Num = Num + 1
i = i - 1
b(a(i)) = 0 '清空使用标识
Else
b(a(i)) = 1 '标记已使用
i = i + 1
a(i) = 0 '重查
End If
End If
Else
i = i - 1
If i = 0 Then Exit Do
b(a(i)) = 0
End If
DoEvents
Loop
End SubPrivate Sub Command1_Click()
pailie 37 'x=37时
End Sub
你写的是把结果写到哪里了?如果NUM 改成DOUBLE 型,执行结果的速度是多长时间?
视图-->立即窗口查看:Sub pailie(ByVal n As Integer)
Dim x() As String
Dim i As Integer, j As Integer, Num As Variant
Dim a() As Integer '记载数组下标
Dim b() As Integer '记载使用标识ReDim x(1 To n)
For i = 1 To n
x(i) = Right("00" & i, 2)
NextReDim a(1 To n)
ReDim b(1 To n)
i = 1
a(1) = 0
Num = 1
Do While i <= n
a(i) = a(i) + 1
If a(i) <= n Then
If b(a(i)) = 0 Then
If i = n Then '达到数组末,则输出组合情况
Debug.Print Num & ":"
For j = 0 To 35
Debug.Print Chr(j \ 12 + 65) & j Mod 12 + 1 & "=" & x(a(j + 1)) & " "; '输出
If j Mod 12 = 11 Then Debug.Print
Next
Debug.Print
Num = Num + 1
i = i - 1
b(a(i)) = 0 '清空使用标识
Else
b(a(i)) = 1 '标记已使用
i = i + 1
a(i) = 0 '重查
End If
End If
Else
i = i - 1
If i = 0 Then Exit Do
b(a(i)) = 0
End If
DoEvents
Loop
End SubPrivate Sub Command1_Click()
pailie 37 'x=37时
End Sub
x=37 时,有 13763753091226345046315979581580902400000000 种排列方法
x=38 时,有 261511308733300555880003612050037145600000000 种排列方法
x=39 时,有 3399647013532907226440046956650482892800000000 种排列方法
要一个运行时间最短的,最多不得超过8分钟,如果行,你试试,谢谢!
Dim result() As Currency, s() As String, stime As Double
If m < n Then MsgBox "条件错误!": Exit Sub
mlen = 1
stime = Timer
ReDim result(1 To mlen)
result(1) = 1
i = m - n
Do While i < m
i = i + 1
last = 0
For j = 1 To mlen
temp = result(j) * i + last
If temp < 100000 Then
result(j) = temp
last = 0
Else
result(j) = Val(Right(temp, 5))
last = Val(Left(temp, Len(temp) - 5))
End If
Next
Do While Not last = 0
mlen = mlen + 1
ReDim Preserve result(1 To mlen)
If last < 100000 Then
result(mlen) = last
last = 0
Else
result(mlen) = Val(Right(last, 5))
last = Val(Left(last, Len(last) - 5))
End If
Loop
Loop
ReDim s(1 To mlen)
For i = 2 To mlen
s(i) = Format(result(mlen + 1 - i), "00000")
Next
s(1) = result(mlen)P = Join(s, "")Debug.Print "P(" & m & "," & n & ")=" & P
Debug.Print "用时 "; FormatNumber(Timer - stime, 8, vbTrue) & " 秒, 结果 " & Len(P) & " 位"
Erase s
Erase result
End SubPrivate Sub Command1_Click()
getP 100000000, 36
End Sub返回:
P(100000000,36)=999993700019099462889901926036938623246248083821852086887335098879658196254148212439642112581058534267823724891946173000409942028847772998454523183338992366391903282030547625265479803293232625111663749174046436512480646753560009542159099170554901700693994796197233746247680000000000000000
用时 0.05937500 秒, 结果 288 位