根据提供的数字逐步执行单个排列顺序

时间:2018-09-06 22:21:00

标签: vba math permutation

我有5个可以按任何唯一顺序放置的项目,我想将一个唯一顺序的值(数字)一一存储到一个变量中。例如:

用户输入:7

然后i_Int = 7

应该给我

  

v_Var = 1

     

等待1秒

     

v_Var = 3

     

等待1秒

     

v_Var = 2

     

等待1秒

     

v_Var = 4

     

等待1秒

     

v_Var = 5

下面的数据列出了5个项目的所有可能排列,第一行列出了排列#,我将没有此数据来使事情变得简单。

1   1   2   3   4   5
2   1   2   3   5   4
3   1   2   4   3   5
4   1   2   4   5   3
5   1   2   5   3   4
6   1   2   5   4   3
7   1   3   2   4   5
8   1   3   2   5   4
9   1   3   4   2   5
10  1   3   4   5   2
...
111 5   3   2   1   4
112 5   3   2   4   1
113 5   3   4   1   2
114 5   3   4   2   1
115 5   4   1   2   3
116 5   4   1   3   2
117 5   4   2   1   3
118 5   4   2   3   1
119 5   4   3   1   2
120 5   4   3   2   1

1 个答案:

答案 0 :(得分:0)

这是一个返回排名1,...,n的{​​{1}}的排列的函数:

i

默认情况下,它以基于1的数组形式返回结果。要使其从0开始,请使用类似Function Unrank(ByVal n As Long, ByVal rank As Long, Optional lb As Long = 1) As Variant Dim Permutation As Variant Dim Items As Variant ReDim Permutation(lb To lb + n - 1) ReDim Items(0 To n - 1) Dim i As Long, j As Long, k As Long, q As Long Dim fact As Long For i = 0 To n - 1 Items(i) = i + 1 Next i rank = rank - 1 j = lb For i = n - 1 To 1 Step -1 fact = Application.WorksheetFunction.fact(i) q = Int(rank / fact) Permutation(j) = Items(q) 'slide items above q 1 unit to left For k = q + 1 To i Items(k - 1) = Items(k) Next k j = j + 1 rank = rank Mod fact Next i 'place last item: Permutation(lb + n - 1) = Items(0) Unrank = Permutation End Function 的调用。作为测试:

Unrank(5,7,0)

Sub test() 'fills A1:A120 with the permutations of 1,2,3,4,5 Dim i As Long For i = 1 To 120 Cells(i, 1).Value = Join(Unrank(5, i), " ") Next i End Sub 太大,无法保存在13!变量中,因此代码在Long时引发未捕获的错误。我使用的算法取决于对相关阶乘进行模块化算术的能力,因此在VBA中没有轻松解决的方法。请注意,您可以轻松地调整代码,以便向其传递要置换的项目数组,而不必总是置换1-n。该算法破坏了数组n=14,因此这种调整将涉及为传递的数组创建一个基于0的副本(以便进行模块化算术运算)。