素数筛法

何为素数:

素数(又称质数):
就是除了1和它本身,没有其他因数的整数
注:1既不是素数,也不是合数。 
注:来自百度百科专业解说

几种判断素数的方法

方法 (1):

#include <stdio.h>
#include <math.h>
int main ()
{
    int n,i,m;
    int flag;
    scanf("%d",&n);
    if(n<2)
        flag=0;
    if(n==2 || n==3)
        flag=1;
    m =(int)sqrt(n);
    if(n>=3)
    {
    for(i=2;i<=m;i++)
    {
        if(n%i==0) 
        {
            flag=0;break;
        }
        else
            flag=1;
    }
    }
    if(flag==1)
    {
        printf("%d是素数!",n);
    }
    else
    {
        printf("%d不是素数!",n);
    }
    return 0;
}

方法 (2):

素数筛法:

输出1-n之间所有的素数

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
#define max 1000000
bool prime[max];
void isprime ()
{
    int i;
    prime[0]=prime[1]=0;
    prime[2]=1;
    for(i=3;i<max;i++)
    {
        prime[i]=i%2==0?0:1;//如果能整除2,则标记为0否则为1
    }
    int t=(int )sqrt(max*1.0);
    for(i=3;i<=t;i++)
    {
        if(prime[i])
        {
            for(int j=i*2;j<max;j=j+i)
            {
                prime[j]=0;//筛 出 i的倍数 能整除i的全部标记为0
            }
        }
    }
    
}
int main ()
{
    int n;
    int i;
    scanf("%d",&n);
    isprime();
    for(i=1;i<=n;i++)
    {
        if(prime[i]==1)
        {
            printf("%d ",i);//如果是素数 则输出
        }
    }
    return 0;
}

输入n判断n是否为素数:

//只需要简单那修改上面的代码的输出

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
#define max 1000000
bool prime[max];
void isprime ()
{
    int i;
    prime[0]=prime[1]=0;
    prime[2]=1;
    for(i=3;i<max;i++)
    {
        prime[i]=i%2==0?0:1;
    }
    int t=(int )sqrt(max*1.0);
    for(i=3;i<=t;i++)
    {
        if(prime[i])
        {
            for(int j=i*2;j<max;j=j+i)
            {
                prime[j]=0;
            }
        }
    }
    
}
int main ()
{
    int n;
    int i;
    scanf("%d",&n);
    isprime();
        if(prime[n]==1)
        {
            printf("%d是素数!",n);
        }
        else
        {
            printf("%d不是素数!",n);
        }
    return 0;
}

简单解释素数筛法:

筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratosthenes)。

具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛法”,简称“筛法”。

筛法演示:

原文地址:https://www.cnblogs.com/pangrourou/p/3232019.html