做N以内的素数表

'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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ggggwhw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值