素数筛选

时间:2022-07-24
本文章向大家介绍素数筛选,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

所谓素数,就是除了一跟本身不能被奇因子整除

那么就直白的思路就是

bool isp(int x){
	if(x<2) return false
	else{
		for(int i=2;i*i<x;i++){
			if(!(x % i))
			return false;
		}
	}
	return true;
}

此种只适用与平时水题,n比较小的!

那么我们来看一种比较高效的思维

思路:我们知道素数的倍数肯定不是素数,所以的话,我们将素数的倍数置为1,经过这一系列处理后,遍历输出为0的即求出了N以内的所有素数!

for (int i=2;i<=n;i++)
    {
        if(!a[i])
        {
            for (int j=2*i;j<=n;j+=i)
                  a[j]=1;
        }
    }

这个其实还是可以优化的,仔细想想这里面有重复筛选的情况,比如6,它就是2*3,但是筛选的时候筛选了2次,因为它既是2的倍数,也是3的倍数。所以这个代码还可以进一步优化。

int pr[2000005];
void is_suu(int n)
{
    int m=sqrt (double(n+0.5));
    memset (pr,0,sizeof(pr));
    for (int i=2;i<=m;i++)
    {
        if(!pr[i])
        {
            for (int j=i*i;j<=n;j+=i)
                     pr[j]=1;
        }
    }
    for (int i=2;i<=n;i++)
          if(!pr[i])
        printf("%d ",i);
    printf("n");
}

还有一种方法如下:(虽然不怎么明白原理)

int isPrime(int n)
{
    if(n<=1)
        return 0;
    if(n==2||n==3)
        return 1;
    if(n%6!=5&&n%6!=1)
        return 0;
    for(int i=5;i<=sqrt(n);i++)
        if(n%i==0||n%(i+2)==0)
        return 0;
    return 1;
}

这里一段完整的代码让大家运行感受下

#include<bits/stdc++.h>
#define N 100000
using namespace std;


/*
bool isp(int x){
	if(x<2) return false
	else{
		for(int i=2;i*i<x;i++){
			if(!(x % i))
			return false;
		}
	}
	return true;
}
*/
int pr[2000005];
void is(int n)
{
    int m=sqrt (double(n+0.5));
    memset (pr,0,sizeof(pr));
    for (int i=2;i<=m;i++)
    {
        if(!pr[i])
        {
            for (int j=i*i;j<=n;j+=i)
                     pr[j]=1;
        }
    }
    for (int i=2;i<=n;i++)
          if(!pr[i])
        printf("%d ",i);
    printf("n");
}



int main(){
	int t;
	cin>>t;
	is(t); 
	
	return 0;
}