zoukankan      html  css  js  c++  java
  • 素数判断和素数筛(简单方便)

    一个数是不是素数就要看它能否被另一个大于1且小于本身的数整除即可;

    我们在寻找素数的过程中发现了素数的一个性质:

    素数:————>分布在6的两侧(2,3是特殊情况要特判)

    证明:6x %6==0

      6x+1

      (6x+2)%2==0     

      (6x+3)%3==0

      (6x+4)%2==0

      6x+5

    但是这是一个必要条件:是素数则有这个性质,因为存在(6x+1)*(6x+5)这样的素数也满足这样的条件,所以在下列if 判断语句后还有for循环进行另一步判断

    #include<iostream>
    #include<cmath>
    using namespace std;
    
    bool Isprime(int num)
    {
        if(num<=3)return num>1;//特判1,2,3
        if(num%6!=1&&num%6!=5)//是否位于6两侧,既不在六的左边也不在六的右边注意用&&。
        return false;
        int eps=sqrt(num);
        for(int i=5;i<=eps;i+=6)//是否能被素数整除;一定是<= 。。。。不然会出错;例如323
            if(num%i==0||num%(i+2)==0)//能被六左侧数整除或者被六右侧数整除注意用||。
            return false;
    
        return true;
    }

     Eratosthenes筛法

    int v[MAXN];
    void primes(int n)
    {
        memset(v,1,sizeof(v));//
        v[0]=0,v[1]=0;
        for(int i=2;i<=n;i++)
        {
            if(!v[i])continue;
                for(int j=i;j<=n/i;j++)
                    v[i*j]=0;//合数是0
        }
    }

    从二开始,是合数则跳过,否则就从i^2开始枚举标记合数,从i^2开始枚举,因为i^2以下的数都已经被枚举过

  • 相关阅读:
    随机的爱
    在使用ASP.NET时进行页面重定向的3种方法。(转)
    [程序员必看]请不要做浮躁的人
    C# datetime 操作
    心碎的浪漫
    动网论坛 企业版

    内存映射文件(File Mapping)API
    内存映射文件
    已知进程句柄,如何知道此进程的主窗口句柄
  • 原文地址:https://www.cnblogs.com/zwx7616/p/11260247.html
Copyright © 2011-2022 走看看