判断素数的算法

最近在学习数据结构和算法,在一本电子书上看到一个打印素数的程序,随后上网搜了一下关于素数的算法。总结了以下两种解法。

 

解1:利用“埃拉托色尼筛”算法打印1~MAX之间的素数,此算法可用于打印一定范围内的素数。数组primes作为是否为素数的标志位,其索引为所要判断的数值。通过for循环,依次将j=2、3、4...的倍数判为合数(即赋予prime数组元素为0),由于n=j*j-1在之前的循环中已经出现过,为此我们可以从n=j*j开始;再结合“如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根”这条定理,我们可以得到,1~MAX之间任何一个合数都可以被某个小于它的平方根的一个数整除,因此我们将j<=sqrt(MAX)作为循环结束条件,以进一步减少多余的循环。

程序如下:

此程序的缺点是无法定位的去判断某一个数是否为素数。如果要实现这样的算法,参照解2。

 

解2:此算法用于打印从1开始的具体数目的素数。通过标志位found判断是否添加新的素数到数组中,同样用到了和解1相同的定理“如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根”。

程序如下:

可以看出,此解法可以很好的判断某一个数trail是否为素数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值