前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >素数筛选

素数筛选

作者头像
杨鹏伟
发布2020-09-11 00:06:10
1K0
发布2020-09-11 00:06:10
举报
文章被收录于专栏:ypwypw

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

那么就直白的思路就是

代码语言:javascript
复制
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以内的所有素数!

代码语言:javascript
复制
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的倍数。所以这个代码还可以进一步优化。

代码语言:javascript
复制
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");
}

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档