240
功不唐捐,玉汝于成😡。

素数判断和素数筛(简单方便)

一个数是不是素数就要看它能否被另一个大于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以下的数都已经被枚举过

posted @ 2019-07-28 18:00  BigXun  阅读(223)  评论(0编辑  收藏  举报