欧拉筛法求素数又称为线性筛法求素数,是一种将求一定范围内的素数的时间复杂度控制在O(n)的一种算法,它跟埃拉特斯尼筛法求素数很像,做了一定的改进,我们知道,埃拉特斯尼筛法之所以没有达到线性筛的水平是因为它对于同一个合数,要重复操作他的质因子个数次,这是很浪费的,而欧拉筛法求素数则去掉了重复操作,它在当合数i可以整除质数时跳出对下一个数进行操作,比方说,当i = 4时,不会筛掉12这个数因为12找到他的最小的质因数是2,12 = 2 * 6,6定义为它相对最大的合数因子,那么4不满足这个条件,所以不在i =4 时筛掉12,而是在i = 6的时候筛掉12.这样就避免了重复操作。


bool IsPrime[1000010];
int Prim[1000010];
int  euler_prime(int n){
    int num = 0, j;
    for(int i = 2; i <= n; i ++){
        if(!IsPrime[i])
            Prim[num ++] = i;
        for(j  = 0; j < num; j ++){
            if(i * Prim[j] > n)
                break;
            IsPrime[i * Prim[j]] = true;
            if(i % Prim[j] == 0)
                break;
        }