Eratosthenes筛法找区间无平方因子的数

筛选的思想:对于不超过n的每个数p,删除2p,3p,4p....当处理完所有数后,还没有被删除的数就是素数。

比如要筛选区间(n,m)的无平方因子数,对于不超过根号m的所有素数p,筛掉区间(n,m)内p²的所有倍数。

首先来找素数,vis[i]表示被删除的数,vis[i]=1表示已经被删除。

筛选方法为:

    int n,m,c=0;
    scanf("%d %d",&n,&m);
    int s=sqrt(m+0.5);
    
    memset(vis,0,sizeof(vis));
    for(int i=2;i<=s;i++)
    if(!vis[i]){
    prime[c++]=i;
    for(int j=i*i;j<=n;j+=i){
        vis[j]=1;
        
    }

再来把(n,m)中间的带平方因子的数删掉,并把不带平方因子的数输出。

    memset(vis,0,sizeof(vis));
    for(int i=0;i<c;i++)
    for(int j=prime[i]*prime[i];j<=m;j+=prime[i]*prime[i])
    vis[j]=1;
    
    for(int i=n;i<=m;i++)
    if(!vis[i]) printf("%d ",i);

发布了57 篇原创文章 · 获赞 58 · 访问量 652

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103566425