求质数的几种算法(转载)

求i到j之间的所有质数
第一种方法:效率最差,是把i到j之间的每一个数n,都拿出来,挨个循环用n除以从2到n-1的所有整数,如果期间有一个能整除,那么n是合数,继续下一个。


第二种方法:,效率稍好,比第一种方法效率提高一倍,是把i到j之间的每一个数n,都拿出来,挨个循环用n除以从2到n/2的所有整数,如果期间有一个能整除,那么n是合数,继续下一个。

第三种方法:算法效率就高了很多,利用合数定理——如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。如50的最小质因数是2,它的平方根是7.07,2<=7.07。也可以用反证法证明。

(设a = bq,因为a是合数,则b和q都是大于1的整数.又设q是a的最小质因数,即b>=q.如果q<=根号a不成立,则必有 q>根号a,此时更有b > 根号a,于是a = bq > 根号a*根号a =  a  出现矛盾,故q <=根号a证毕.  )

利用这个原理,只需将i和j之间得某个数n取出,并用循环将n除以从2到根号n之间的所有整数如果期间存在一个数可以整除,那n为合数,否则为质数。

第四种方法:是效率最高的一种方法。首先建立一个布尔型1维数组a,长度为j-i,初始值为true。首先用第三种方法求得i、j之间的第一个质数m。求得m 以后,将所有小于i的m的倍数所在的数组(即a[m的倍数-i])位置全部设为false。然后进行下一步,从n=m++开始,如果a[n-i]已经被设 置为false,则n++,直到出现首个为true的位置p,再将所有小于i的p的倍数所在的数组位置置为false。继续下一步,直到n>根号j 为止,这样所有为true的数组id(如果i=1则0除外,id从1开始)+i 即为质数。
举个例子。例如要查找 2-100之间的质数,首先2是质数,把2的倍数去掉(比如4,6,8,...,100,对应的数组位置是a[m-2]即 a[2],a[4],a[6],...,a[98],将这些位置设为false);进行下一步,此时3没有被去掉(a[2]=true),可认为是质数, 所以把3的倍数去掉(a[5]a[8]a[11],...,a[98]=false);再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而 100以内的任意合数的最小质数因子肯定小于等于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。最后只要将a[id]中所 有等于true的id值加上i输出即可。按照这个例子是id+2,比如0+2,1+2,3+2,...
相对来说这种算法求1到n之间的质数实现起来比较简单,如果是求任意两个数之间的质数,逻辑上会比较复杂。但是,效率的确提高了很多很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值