'Excel宏代码原创分享,转发请注明来源,作者:王欢为,WX:13772568903。
功能:1.找到N以内所有素数,返回这些素数的数量。
功能:2.找到N以内所有素数,返回这些素数组成的数组。
功能:3.找到N以内所有素数,返回其中最大的素数。因为本函数是以做素数表为基本功能,所以实现功能3并不是最快捷的办法,更快的办法应该是,从N向下依次判断这些数字是不是素数,如果是素数就返回该数字。
速度:第1E7以内素数1秒内出结果素数总计664579个。第1E8以内素数7-9秒内出结果素数总计5761455 个。更大的数字没有测。
输入格式:
FFSushubiao2(正整数),例如:FFSushubiao(10000)
上面格式返回第10000以内的素数个数: 1229
FFSushubiao2(正整数, 2),例如:FFSushubiao(10000, 2)
上面格式返回10000以内的素数组成的数组。
FFSushubiao2(正整数),例如:FFSushubiao(10000, 3)
上面格式返回第10000以内最大的素数: 9973
函数代码如下:
Function FFSushubiao2(Num1&, Optional ByVal Leixing1zhi4 As Integer = 1)
'Excel宏代码原创分享,转发请注明来源,作者:王欢为,WX:13772568903。
'功能:1.找到N以内所有素数,返回这些素数的数量。
'功能:2.找到N以内所有素数,返回这些素数组成的数组。
'功能:3.找到N以内所有素数,返回其中最大的素数。因为 _
本函数是以做素数表为基本功能,所以实现功能3并不是 _
最快捷的办法,更快的办法应该是,从N向下依次判断这 _
些数字是不是素数,如果是素数就返回该数字。
Dim ii&, jj&, kk&, Num2#
Dim Arr1() As Long
ReDim Arr1(1 To Num1) As Long
Dim Arr2() As Long
Num2 = Sqr(Num1)
ii = 1
jj = 1
Biaoji2:
ii = ii + 1
Do While Arr1(ii) = 1
ii = ii + 1
Loop
Arr1(jj) = ii
jj = jj + 1
For kk = ii To Num1 Step ii
Arr1(kk) = 1
Next kk
If ii < Num2 Then
GoTo Biaoji2
Else
For kk = ii To Num1
If Arr1(kk) = 0 Then
Arr1(jj) = kk
jj = jj + 1
End If
Next
End If
ReDim Arr2(1 To jj - 1) As Long
For ii = 1 To jj - 1
Arr2(ii) = Arr1(ii)
Next ii
If Leixing1zhi4 = 2 Then
FFSushubiao2 = Arr2
ElseIf Leixing1zhi4 = 3 Then
FFSushubiao2 = Arr2(jj - 1)
Else
FFSushubiao2 = jj - 1
End If
End Function
测试的例子:
Sub ceshi()
Dim qq, tt
tt = Timer
qq = FFSushubiao2(10000, 1)
Debug.Print Timer - tt
Debug.Print qq
End Sub