算应该比较快,输出要慢些:Sub pailie(ByVal n As Integer, ByRef x() As String) Dim starttime As Single, endtime As Single Dim i As Long, j As Long, k As Integer, Num As Long Dim ALL(), TEMP1 As Long, TEMP2 As Long starttime = Timer '开始计时 Num = 1 For i = 1 To n Num = Num * i '递归计算n! Next ReDim x(1 To Num) For i = 1 To Num ReDim ALL(1 To n) '初始化数组all ALL(1) = 1 TEMP1 = i For j = 2 To n TEMP2 = TEMP1 Mod j TEMP1 = TEMP1 \ j If TEMP2 = 0 Then ALL(j) = j 'temp2为 0则放在最后 Else For k = j To TEMP2 + 1 Step -1 ALL(k) = ALL(k - 1) ' temp2之后的元素后移一位 Next ALL(TEMP2) = j 'temp2不为 0 则置于第temp2个元素前 End If Next x(i) = Join(ALL, " ") 'Debug.Print x(i) '输出 Next endtime = Timer Debug.Print "共 " & Num & " 种排列!用时 " & endtime - starttime & " 秒!" End SubPrivate Sub Command1_Click() Dim x() As String pailie 9, x MsgBox x(1001) End Sub
我在csdn,搜索到一个代码,但是效率太低了,算n=9,就用了1分20秒。是不是用了递规效率低啊,能者帮忙。
Dim starttime As Single, endtime As Single
Dim i As Long, j As Long, k As Integer, Num As Long
Dim ALL(), TEMP1 As Long, TEMP2 As Long
starttime = Timer '开始计时
Num = 1
For i = 1 To n
Num = Num * i '递归计算n!
Next
ReDim x(1 To Num)
For i = 1 To Num
ReDim ALL(1 To n) '初始化数组all
ALL(1) = 1
TEMP1 = i
For j = 2 To n
TEMP2 = TEMP1 Mod j
TEMP1 = TEMP1 \ j
If TEMP2 = 0 Then
ALL(j) = j 'temp2为 0则放在最后
Else
For k = j To TEMP2 + 1 Step -1
ALL(k) = ALL(k - 1) ' temp2之后的元素后移一位
Next
ALL(TEMP2) = j 'temp2不为 0 则置于第temp2个元素前
End If
Next
x(i) = Join(ALL, " ")
'Debug.Print x(i) '输出
Next
endtime = Timer
Debug.Print "共 " & Num & " 种排列!用时 " & endtime - starttime & " 秒!"
End SubPrivate Sub Command1_Click()
Dim x() As String
pailie 9, x
MsgBox x(1001)
End Sub
http://blog.csdn.net/northwolves/archive/2004/07/21/47601.aspx
http://blog.csdn.net/northwolves/archive/2004/07/21/47413.aspx
http://blog.csdn.net/northwolves/archive/2004/07/21/47400.aspx