Ещё есть способ воспользоватся решетом Эратосфена.
- Код: Выделить всё
Public Sub EratosthenesSieve(ByRef N As Long, ByRef P() As Long)
Dim C As Boolean
Dim I As Long
Dim J As Long
Dim K As Long
Dim R As Long
Dim S As Double
If N > 200# Then
R = Fix(N / (Log(N) - 2#) + 1#)
Else
R = Fix(1.6 * N / Log(N) + 1#)
End If
ReDim P(1# To R)
P(1#) = 1#
P(2#) = 2#
P(3#) = 3#
I = 4#
Do
P(I) = 0#
I = I + 1#
Loop Until Not I <= R
J = 3#
K = 3#
Do
I = 2#
S = Sqr(K)
C = True
Do
I = I + 1#
If P(I) > S Then
P(J) = K
J = J + 1#
C = False
End If
Loop Until Not (Fix(K / P(I)) * P(I) <> K And C)
K = K + 2#
Loop Until Not K <= N
End Sub
Но этот алгоритм не совсем понятен...
Может кто поможет?