欧拉素数筛选算法详解编程语言

给定一个正整数n,找到其范围内的所有素数,并利用最小的时间复杂度

这道题在面试的时候,面试官给了一个小时且不断提示都没能做到完美。。。

用了欧拉筛选这个数学方法,主要有两点 1.标记出非素数 2.标记的过程中 只判断必要的

#include<cstdio> 
#include<cstring> 
const int maxn=10000; 
 
int prime[maxn+1]; 
void getprime() { 
    memset(prime,0,sizeof(prime)); 
    for(int i=2;i<=maxn;i++) { 
        if(!prime[i]) prime[++prime[0]]=i; 
        for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++) { 
            prime[i*prime[j]]=1; 
//下面这一步是比较难理解的 
            if(i%prime[j]==0) break; 
        } 
    } 
} 
 
int main() { 
    getprime(); 
    for(int i=1;i<=prime[0];i++) { 
        printf("%d/n",prime[i]); 
    } 
}

prime[n]充当最小素因子,一旦被整除就break,后面没有筛除的,说明i不是他们的最大因数。这样就不会重复了。

举个例子  i为4 prime[j] 为2 ,4*2已经算出8了,4%2为0,根据数学理论证明(我没搞太懂),4不是后面数的最大因子了

(比如6*2为12,这个6就大于4),下面的就该交给别的比较大的数去筛选了

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/17561.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论