Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >素数筛选

素数筛选

作者头像
杨鹏伟
发布于 2020-09-10 16:06:10
发布于 2020-09-10 16:06:10
1.1K00
代码可运行
举报
文章被收录于专栏:ypwypw
运行总次数:0
代码可运行

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

那么就直白的思路就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
#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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2018 蓝桥杯省赛 B 组模拟赛(五) B 结果填空:素数个数
题目链接: https://nanti.jisuanke.com/t/25085
Ch_Zaqdt
2019/01/10
3470
ACM刷题之路(二十一)大素数筛选 2019暑期集训 POJ 2689 Prime Distance
题目大致意思就是:告诉你一个s和e,求s和e之间靠的最近的两素数和离得最远的两素数,如果没有就输出There are no adjacent primes.这一句话。s和e范围为小于2,147,483,647的正整数,并且e和s最大相差不超过100W.
Designer 小郑
2023/08/01
1750
万人千题——素数筛选
还是要优化,首先分析为什么超时,发现主要的原因是从2开始每一个数都进行了素数的判断,所以说浪费了时间,在上一篇素数的判断,我们提到可以使素数*相同的倍数,来减少判断的次数。 从而引出了Eratosthenes筛选
秋名山码神
2022/12/13
2350
万人千题——素数筛选
nyoj---快速查找素数
快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。 输入给出一个正整数数N(N<=2000000) 但N为0时结束程序。 测试数据不超过100组输出将2~N范围内所有的素数输出。两个数之间用空格隔开样例输入 5 10 11 0 样例输出 2 3 5 2 3 5 7 2 3 5 7 11 来源经典题上传者路过这 同一道题,虽然用同一种方法,但是,效率还是有差别的.... 试除法。。。(1)
Gxjun
2018/03/21
7570
ACM刷题之路(二十)线筛素数+找规律f(n) 2019暑期集训 HDU 2585
感谢此大佬的博客:https://blog.csdn.net/codeswarrior/article/details/81263050 写的非常好!
Designer 小郑
2023/08/01
1840
HDUOJ-----(1329)Calling Extraterrestrial Intelligence Again
Calling Extraterrestrial Intelligence Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4083    Accepted Submission(s): 2140 Problem Description A message from humans to extraterrestrial intelli
Gxjun
2018/03/21
8000
【PAT乙级】数素数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
3660
素数环-dfs+素数打表
素数环-dfs+素数打表(易理解) #include<stdio.h> #include<string.h> int a[50],b[50],vis[50],n; void prime(){ //素数打表 memset(a,0,sizeof(a)); a[0]=a[1]=1; //素数为0非素数为1 for(int i =2;(!a[i])&&i<50;i++) //a[i]=1表明是素数,则其倍数也是素数因为i就是前边的素数的倍数 for(int j=i
知识浅谈
2020/03/24
6040
LightOJ - 1197 区间素数筛模版
给t给样例,每个样例a,b两个数,求区间[a,b]内素数的个数,(1 ≤ a ≤ b < 2^31, b - a ≤ 100000).
用户2965768
2019/08/01
2700
java素数筛选法
判断是否为素数 对于一个任意一个正整数,如果它只能被自身或1整除,称其为素数,否则为合数。1比较特殊,既不是质数也不是合数。
lexingsen
2022/02/24
5590
java素数筛选法
杭电2016年计算机复试真题
此题目是根据 CSDN 博客粥粥同学发布的内容进行收集整理,记录了本人的解题过程和一些想法。仅供大家参考,如有错误,欢迎大家指出!
EmoryHuang
2022/09/26
3170
数学--数论--素数
定义判断: bool isPrime (int n) { for(int i=2;i*i<=n;i++) { if(n%i==0) return false; } else return false; } 埃氏筛法 int primes[N],cnt; bool bprime[N]; void getPrime(int n){ memset(bprime,false,sizeof(bprime)); bprime[0]=true; bprime[1]=true;
风骨散人Chiam
2020/11/05
4310
大一的算法笔记
1.求三个最大数中,老师用了函数,系统函数max,而且是镶嵌套用。 再看自己的代码,可以看出效率的高低。在今后的数量大小比较中,应该学会使用 max系统函数,同时掌握其他系统函数。
废江_小江
2022/09/05
3000
【Difference Between Primes HDU - 4715】【素数筛法打表+模拟】
这道题很坑,注意在G++下提交,否则会WA,还有就是a或b中较大的那个数的范围。。
_DIY
2019/09/29
2870
C语言素数优化方法
题目:求1~N范围中的素数。k为当前数值,j为被除数 素数:一个大于1的自然数中,除了1和本身外无法整除其余数的数值。
CtrlX
2022/11/16
3.2K0
欧拉函数模板
void eular() { memset(vis,0,sizeof(vis)); vis[0]=vis[1]=1; for(i=2;i*i<=N;i++) { if(vis[i]==0) { for(j=i*i;j<=N;j+=i) vis[j]=1; } } //这段求出了N内的所有素数 for(i=1;i<=N;i++) phi[i]
用户1624346
2018/04/17
6440
素数推断算法(高效率)
关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信
全栈程序员站长
2022/07/14
3340
golang 刷leetcode 数学基础(1)素(质)数
此方法的问题在于许多不必要的计算,因此可以想到用空间换时间:筛选出来的素数的倍数都可以标记为合数
golangLeetcode
2022/08/02
2850
JAVA 练习 找出素数
package com.zhang.hello; public class Task { /** * 1. 输出打印九九乘法表 * */ public void NO1(){ for(int i=1;i<10;i++){ for(int j=1;j<=i;j++){ System.out.print(j+"*"+i+"="+(i*j)+"\t"); }
拾点阳光
2018/05/10
8790
素数筛选算法
最近学习了一种筛素数的方法,能够以时间复杂度O(n),即线性时间完成。一开始不能理解其中的一句话,搜索了很久,大部分结果都是一群人在网上卖萌。好好思索了一番,按照自己的思路终于理解了。本文的内容绝不卖萌,但也难称严谨,仅以备忘,欢迎斧正。
我是东东东
2018/08/01
1.1K0
相关推荐
2018 蓝桥杯省赛 B 组模拟赛(五) B 结果填空:素数个数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档