经过计算验证,1-20共有6,309,300种排列组合满足要求。
- Dim a&(), b(), c() As Boolean, k&, n&, cnt&
- Sub 圆圈相邻数相加为素数的排列计算()
- Dim i&, tms#
- [a1].CurrentRegion = ""
- tms = Timer
- n = 10 '此处n为数字范围的一半即奇偶个数 n=10的实际范围为1-20
- ReDim a(3, n - 1), b(2 * n - 1)
- For i = 1 To n
- a(2, i - 1) = i * 2: a(3, i - 1) = i * 2 - 1
- Next
- a(1, 0) = 1: b(0) = 1: c = GetPrime(4 * n - 1)
-
- k = 0: cnt = 0: Call dgPL(0, 1)
- Cells(n, 27) = 2 * n: Cells(n, 28) = k: Cells(n, 29) = cnt: Cells(n, 30) = Format(Timer - tms, "0.000s")
- MsgBox Format(Timer - tms, "0.000s ") & k & "/" & cnt
- End Sub
- Sub dgPL(i&, t&)
- Dim j&
- cnt = cnt + 1
- If t = 2 * n Then If c(b(2 * n - 1) + 1) Then k = k + 1: If k < 11 Then Cells(k, 1).Resize(, 2 * n) = b
- For j = 0 To n - 1
- If a(i, j) = 0 Then
- If c(b(t - 1) + a(i + 2, j)) Then
- a(i, j) = 1: b(t) = a(i + 2, j)
- Call dgPL(IIf(i, 0, 1), t + 1)
- a(i, j) = 0: b(t) = ""
- End If
- End If
- Next
- End Sub
- Function GetPrime(n&) '计算素数数列
- Dim a&(), b() As Boolean, i&, j&, k&, m&, s&
- m = n \ 2: ReDim a&(m), b(3 To n) As Boolean
- For i = 1 To Sqr(n) \ 2
- If a(i) = 0 Then
- s = i * 2 + 1: b(s) = True: k = k + 1: a(k) = s
- For j = (i * 3 + 1) To m Step s
- a(j) = 1
- Next
- End If
- Next
- For i = (a(k) + 1) / 2 To m
- If a(i) = 0 Then s = i * 2 + 1: b(s) = True ': k = k + 1: a(k) = s
- Next
- GetPrime = b
- End Function
复制代码
|