我的递归算法比你至少快1倍。
是在上次圆圈素数的基础上改的。- Dim a&(), b(), c() As Boolean, k&, n&, cnt&
- Sub 矩阵相邻数相加为素数的排列计算()
- Dim i&, tms#
- [a:d] = ""
- tms = Timer
-
- n = 8 '实际范围为1-16
- ReDim a(3, n - 1), b(3, 3)
- For i = 1 To n
- a(2, i - 1) = i * 2: a(3, i - 1) = i * 2 - 1
- Next
- c = GetPrime(4 * n - 1)
-
- k = 0: cnt = 0: Call dgPL2(1, 0): Call dgPL2(0, 0)
- MsgBox Format(Timer - tms, "0.000s ") & k & "/" & cnt
- End Sub
- Sub dgPL2(i&, t&)
- Dim i1&, j1&, j&, r&, f As Boolean
- cnt = cnt + 1
- If t = 2 * n Then Cells(k * 5 + 1, 1).Resize(4, 4) = b: k = k + 1
- i1 = t \ 4: j1 = t Mod 4
- For j = 0 To n - 1
- If a(i, j) = 0 Then
- f = False: r = a(i + 2, j)
- If i1 = 0 Then f = True Else If c(b(i1 - 1, j1) + r) Then f = True
- If f Then If j1 Then f = c(b(i1, j1 - 1) + r)
- If f Then
- a(i, j) = 1: b(i1, j1) = r
- Call dgPL2(IIf(j1 = 3, i, IIf(i, 0, 1)), t + 1)
- a(i, j) = 0: b(i1, j1) = ""
- 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
复制代码 |