素数小结

素数小结

素数求解问题:1,给定一个数字,判断某数是否为素数;2,求10000内有多少素数3,已知一个数字是两个素数之积,求这个素数


1,针对判断一个数是否为素数,我们根据定义简单的想到,只要被除了1和本身的数整除就是合数,反之则为素数,1既不是素数也不是合数。学过C语言的人很容易就能写出。



2,其实我们发现,如果A是合数,那么必然满足A=B*C,B<=C,显然B*B<=A

这样我们就把时间复杂度由n变到n^1/2了 。

 

3,素数筛选法

而我们反着考虑,如果问100内有多少素数,我们这样考虑4,6,8,10,……98,100都可以被2整除,6,9,12,……,96,99都可以被3整除那么我们不妨这样把合数筛选出来。于是有代码如下:

时间复杂度为O(N*loglog(N))

4,线性素数筛

这是一个复杂度大于O(N)的算法,我们考虑是否可以继续降低复杂度,我们有如下理论铺垫,假设A是一个合数,那么有如下:

A=B*C,B是整除A的最小素数,C!=1,且有C=D*E,D是整除C的最小素数,E>=1,那么必有B<=D,(因为A=B*D*E,B是整除A的最小素数,那么D作为素数必然比B大或者相等),对于每一个C,我们找到整除A的唯一一个最小的素数B,这样就可以将A筛去并且只筛选一次。我们有一个符号规定list(p)为小于等于p的素数表

2-list(2)={2}-筛去2 整除2的最小素数为2

3-list(3)={2,3}-筛去6,9  整除3的最小素数为3

4-list(4)={2,3}-筛去8  整除4的最小素数为2

5-list(5)={2,3,5}-筛去10,15,25  整除5的最小素数为5

……

在如上实例中最小素数为B,最左边的数我们作为C,那么每次找B的上限也就是D

有代码如下:

时间复杂度为O(N)

注:以上参考自小象学院讲师胡光视频课


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值