先代码奉上:

试除法

#include<iostream>
#include<cmath>
using namespace std;bool isprime(int n)
{if(n<=1) return false;for(int i=2;i<=n/i;i++){if(n%i==0) return false ;else return true;}}int main()
{int n;cin>>n;cout<<isprime(n)<<endl;}

1.判断用 bool类型

2.为了节约时间

1.i<=n;

2.i<=sqrt(n);//记得用上#include <cmath>

3.i<=n/i;//防止溢出

埃式筛

#include <iostream>
using namespace std;
const int N=1e5;
int n;
bool status[N];
int primes[N];
int num=0;
bool get_primes(int n)
{for(int i=2;i<=n;i++){if(!status[i]){primes[num]=i;num++;}for(int j=i*2;j<=n;j=j+i){status[j]=1;                        //时间复杂度约为o(n*log2n) }}
}
int main()
{cin>>n;get_primes(n);for(int i=0;i<num;i++){cout<<primes[i]<<" ";}return 0;
}

总结归纳:埃式筛运用 是不是2的倍数,3的倍数,4的倍数来筛。。。以此类推。

首先定义一个状态数组(判断它是否为素数,bool类型,建议0为素数,1为合数),定义一个用来装素数的数组(int 类型即可),初始一个num=0 用来判断素数个数,一个整数n。之后写一个bool 类型的函数(用来获取素数数组和素数个数),从2开始即可(n<=1 尚且归为不在考虑范围之类),此时建议0为素数,1为合数起作用了,定义在函数外的数组初始化为0,所以没有判断的数即为素数。因此若直接从i等于2开始,int j=i*2;j<=n;j+=i,的数为大于等于4的合数。把它们改变一下状态即可。最后记得运用函数前,必须先调用该函数,可以看到get_primes(int n)函数并没有输出的值,而是把素数数组和素数个数分别存入了数组和num 中。

欧拉筛

#include <iostream>
using namespace std;
const int N=1e5;
int n;
bool status[N];
int primes[N];
int num=0;
bool get_primes(int n)
{
    for(int i=2;i<=n;i++)
    {
        
        if(!status[i]){primes[num]=i;
        num++;
        }
        for(int j=0;primes[j]<=n/i;j++)
        {                                  //时间复杂度为0(n) 
            status[primes[j]*i]=1;
            if(i%primes[j]==0) break;
         } 
    }
}
int main()
{
                                                                             
    cin>>n;
    get_primes(n);
    for(int i=0;i<num;i++)
    {
        cout<<primes[i]<<" ";
    }
    return 0;
}

#include <iostream>
using namespace std;
const int N=1e5;
int n;
bool status[N];
int primes[N];
int num=0;
bool get_primes(int n)
{for(int i=2;i<=n;i++){if(!status[i]){primes[num]=i;num++;}for(int j=0;primes[j]<=n/i;j++){                                  //时间复杂度为0(n) status[primes[j]*i]=1;if(i%primes[j]==0) break;} }
}
int main()
{cin>>n;get_primes(n);for(int i=0;i<num;i++){cout<<primes[i]<<" ";}return 0;
}

总结归纳:原理:只用最小质因子来筛

可以发现 欧啦筛与埃式筛只有两行代码的区别,但是欧啦筛却比埃式筛快几个数量级。

注意;用的是最小质因子来筛,为了是最小,我们从0开始枚举,为了是素数,我们从素数数组中挑选它的倍数,注意素数*i=合数(我们要筛的数)。primes[j]<=n/i,其实就是如此。为了不和埃式筛一样重复,我们(i%primes[j]==0) break;跳出即可。

素数筛——试除法——埃式筛——欧啦筛相关推荐

  1. 【如何求素数】试除法讲解

    试除法 1.素数的定义 2.for套嵌使用求解素数 3.试除法的算法优化 1.素数的定义 素数又称为质数,指的是在大于1的整数中 只能被1和这个数本身整除的数. 在了解了素数的定义之后,我们如何用C语 ...

  2. 线性筛素数(欧拉筛)

    欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...

  3. 埃氏筛与欧拉筛(线性筛)

    目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...

  4. 欧拉筛(线性筛)超级详解 - Python3实现

    # acwing 868. 筛质数 N = 1000010def get_prime():global cntfor i in range(2,n+1):if not st[i]:cnt += 1# ...

  5. 欧拉筛+埃式筛求素数

    参考:https://blog.csdn.net/nk_test/article/details/46242401 先看一下经典的埃拉特斯特尼筛法: 1 int prime[MAXN],vis[MAX ...

  6. 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))

    素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...

  7. 算法笔记--素数筛(朴素筛,埃式筛,欧拉筛)

    素数 素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.如2 , 3 , 5 , 7 , 11等. 素数筛 素数筛即筛选出1~n内的素数的方法,这里介绍三种 常见的求素数 ...

  8. 素数筛法详解:埃氏筛和欧拉筛

    文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...

  9. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

最新文章

  1. NeHe OpenGL第三十五课:播放AVI
  2. 分支机构L2L *** 到总部再PAT通过专线到合作伙伴(SVTI建立***)
  3. 【Cf Edu #47 F】Dominant Indices(长链剖分)
  4. EXE与SYS通信(直接访问模式)
  5. 说实话,用完Gradle之后,有点嫌弃Maven了。贼好用!
  6. SonarQube中配置c语言/c++语言代码规则插件
  7. 找2个数组中相同的数
  8. 动态阈值_如何设置数据看板(大屏)数据异常报警的动态阈值
  9. hive数据去重测试
  10. wireshark的简单使用:在二进制流中还原出zip文件
  11. Android开发之内容提供者ContentProvider
  12. iOS创建苹果证书、制作p12证书流程
  13. 【基于深度学习的人机对弈机器人——视觉识别】
  14. 1.4 px30驱动移植-网卡驱动找不到网卡解决
  15. pta构造回文数C语言,【LeetCode】 #9:回文数 C语言
  16. Axure chrome插件安装
  17. untiy Input 获取鼠标以及触摸操作
  18. Yarn Web页面 8088 端口在Windows浏览器无法访问
  19. 从Python爬虫到Spark预处理数据的真实需求[三]
  20. 【MATLAB】机器学习:决策树算法实验

热门文章

  1. 2023 新年倒计时HTML源码
  2. 值得你关注的Android6.0上的重要变化(一)
  3. Java开发必须掌握!开源掌机玩java
  4. 【STC8A8K64S4A12开发板】—开始做 定时器/计数器 实验啦
  5. 华为maters保时捷鸿蒙,【华为MateRS保时捷版评测】编辑分享:妙用华为Mate RS保时捷之三摄_华为 Mate RS保时捷版_手机评测-中关村在线...
  6. 卷积神经网络和深度神经网络的区别是什么?
  7. 卷积神经网络CNN(7)—— 限速交通标志分类
  8. 阿里巴巴总裁马云语录
  9. MarkdownPad 2 激活方法与图片上传解决方案
  10. Camtasia studio编辑、合成视频和音频——自用