• 素数筛法


    何为素数:

    素数(又称质数):
    就是除了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的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛法”,简称“筛法”。

    筛法演示:

  • 相关阅读:
    20200807日报
    20200806日报
    《大道至简》读书感悟
    20200805日报
    20200804日报
    20200803日报
    20200802日报
    vue中mounted内如何调完异步方法再渲染
    小程序画布识别iPhone11
    np.meshgrid() 生成网格坐标函数
  • 原文地址:https://www.cnblogs.com/pangrourou/p/3232019.html
Copyright © 2020-2023  润新知