两种素数打表总结

1.普通筛选法--埃拉托斯特尼筛法

所用的原理大概是所使用的原理是从2开始,将每个素数的各个倍数,标记成合数。一个素数的各个倍数,是一个差为此素数本身的等差数列。此为这个筛法和试除法不同的关键之处,后者是以素数来测试每个待测数能否被整除。

实现方法:建立一个bool类型的数组check,一个int类型的数组prime储存素数,先假设所有的数都是素数(初始化为0),从第一个素数2开始,把2的倍数都标记为非素数(check置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,进行同样的处理,直到最后,数组中依然为0的数即为素数。

void prime()
{
    k=0;
    for(int i=2;i


埃拉托斯特尼筛法虽然已经将时间复杂度降低到O(nloglogn),但是还是有不足之处。

因为6在i==2时就被标记了,而在i==3的时候又被标记了一次,所以还是有改进的空间。

 

4.线性筛选法——欧拉筛法

 欧拉筛法保证每个合数只会被它的最小质因数筛去,时间复杂度降低到O(n)

void prime()//线性筛
{
    k=0;
    for(int i=2;i

在根据自己的理解总结一下线性筛

每个合数由多个素数相乘,则其必有一个最小素数因子,利用这个原理,可以让每个数都被其最小素因子筛去,避免重复操作。

        每当 i % pr[j] == 0 时就break,因为后面的几组数里的p[j]都不会是最小素因子。。 比如i=9,现在素数是2,3,5,7,进入二重循环,visit[2*9]=1;visit[3*9]=1;这个时候9%3==0,要跳出。因为5*9可以用3*15来代替,5不是45的最小质因素!如果这个时候计算了,i=15的时候又会被重复计算.在通俗一点就是,9中含有质因素3,9*5=45时,45中质因数5比9中3大,5已不是最小质因数.....

 

 

你可能感兴趣的:(两种素数打表总结)