筛法

https://www.dotcpp.com/oj/problem1084.html?sid=1756019&lang=1#editor

不要小看简单的题目哦。一步步来。

 

 

 

 

 

#include<iostream>
using namespace std;

#define maxn 10000000

bool vis[maxn];
int prime[maxn],x;

void isprime(int n) //埃氏筛
{
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) prime[x++]=i;
        for(int j=2;j*i<=n;j++)
        {
            vis[i*j]=true;
        }
    }
}


void oulasai(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])prime[x++]=i;//i未被访问过,则i就是素数
        for(int j=0;j<x;j++)
        {
            if(i*prime[j]>n)break;
            vis[i*prime[j]]=true;//prime里的数都比i小,则prime里必有一个(i*prime)的最小质因数                  
             if(i%prime[j]==0)break;//如果i%prime==0则prime是(i*prime)最小质因数,
             //然后(i*prime)只会在这里被筛选过一次,
             //比(i*prime)大的有最小质因数prime的数会在(i+n)时轮到该prime,然后筛掉 
         } 
    }
}

void isprime2(int n)
{
    for(int i=0;i<=n;i++)
    {
        prime[i]=1;
    }
    for(int i=2;i<=n/2;i++)
    {
        for(int j=2;j*i<=n;j++)
        {
            prime[j*i]=0;
        }
    }
}
//好像是假的 
void oulasai2(int n)
{
    for(int i=0;i<=n;i++)
    {
        prime[i]=1;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=2;i*j<=n;j++)
        {
            if(prime[j*i]==0)continue;
            prime[j*i]=0;
        }
    }
}

int main()
{
    int n;
    cin>>n;
    
    isprime2(n);
    prime[0]=0;
    prime[1]=0;
    for(int i=0;i<=n;i++)
    {
        if(prime[i]!=0)cout<<i<<endl;
    }
    return 0;
}
上一篇:习题


下一篇:第5章-8 能被3,5和7整除的数的个数(用集合实现) (30分)python