线性筛选素数

来源:互联网 发布:用友nc软件下载 编辑:程序博客网 时间:2024/06/08 07:25

时间复杂度为O(n)

来自百度文库


一般的线性筛选法

prime[0] = false;

prime[1] =false;
for (int i=2;  i<N;  i++)
{
    if (prime[i])
    {
        primes[++cnt ]=i;
        for (int k=i*i; k<N; k+=i)
            prime[k]=false;
    }
}


#include<iostream>

#include <cstdio>

using namespace std;

const int n=200000;

int prime[n]= {0},num_prime=0;

int main()
{
    int a[n]= {1,1},i,j;

    for(i=2; i<10000; i++)
    {
        if(!a[i])
            prime[num_prime++]=i;
        for(j=0; j<num_prime && i*prime[j]<n; j++)
        {
        a[i*prime[j]]=1;
        if(!(i%prime[j]))
            break;
        }
    }

    /*

    for(i=0; i<100; i++)

    {
        printf("%d\n", prime[i]);
    }
    */

    return 0;

}

 
线性筛法,即是筛选掉所有合数,留下质数 
我们知道合数可以由一个质数数与另一个数相乘得到 而同时假设合数a=质数b×质数c×一个数d 令e=c × d,假设b  ≥ e,e为合数,令f=d × b  a=f × c ,其中c<e; 
即比一个合数数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到 这也是if(!( i % prime[j]))break;的含义,这也是线性筛法算质数表的关键所在

0 0
原创粉丝点击