筛质数(暴力法、埃氏筛、欧拉筛)

筛质数(暴力法、埃氏筛、欧拉筛)

暴力法

思路分析:

直接双for循环来求解质数

如果不设置标记只是简单地执行了break会导致内部循环(由j控制)而不是立即打印i或者跳过它。如果打印语句写到内部循环中,也会导致每个

非素数也被打印出来多次(在找到其因子之前)。

code:

cpp 复制代码
#include <iostream>
using namespace std;
int n;
int main() {
    cin >> n;
    for (int i = 2; i <= n; i++) { // 从2开始,因为1不是素数
        bool isprime = true; // 假设i是素数
        for (int j = 2; j * j <= i; j++) { // 只需要检查到sqrt(i),因为如果i有一个大于sqrt(i)的因子,那么它必然还有一个小于或等于sqrt(i)的因子
            if (i % j == 0) {
                isprime = false; // 如果找到一个因子,则i不是素数
                break;
            }
        }
        if (isprime) { // 如果i是素数,则打印它
            cout << i << " ";
        }
    }
    return 0;
}

埃氏筛

思路分析:

如果一个数是素数,那么它的倍数就不是素数

code:

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int p[100010]={1,1};//f[i]=1代表不是素数
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        if(p[i]==1) continue;
        for(int j=2;i*j<=n;j++){
            p[i*j]=1;
        }
    }
    for(int i=1;i<=n;i++){
        if(p[i]==0){
            cout<<i<<' ';
        }
    }
}

欧拉筛

思路分析:

基本思想:确保每个数只被其除1以外的最小质因数标记。

实现:<需要一个数组把它存储起来,

逆向思考:从最大因数开始找到最小的质因数,

在处理一个数时,需要遍历所有已经找到的质数,并当该质数是当前数的因数时退出循环,这是因为对于更大的数,当前数已不再是其最大的因数,无需继续处理。>

code:

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int d=0;
    int p[10010]={0};
    int f[10010]={1,1};
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        if(f[i]==0){//如果没有被标记过,那么i是质数
            p[d++]=i;//先运行后加
        }
        for(int j=0;j<d;j++){
            if(p[j]*i<=n){//标记以i为最大因数的数不是素数
                f[p[j]*i]=1;
            }
            else{
                break;
            }
            if(i%p[j]==0){//如果p[j]是i的因数,那么后面的数都不是以i为最大因数的
                break;
            }
        }
    }
    for(int i=0;i<d;i++){
        cout<<p[i]<<' ';
    }
}

如果 i 能够被 p[j] 整除(即 i % p[j] == 0),那么说明 p[j] 是 i 的一个因数。由于我们已经用 p[j] 标记了所有小于或等于n的 p[j] 的倍数,所以没有必要再用更大的质数去标记 i 的倍数。因此,可以跳出内层循环。

相关推荐
草莓熊Lotso14 分钟前
C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战
前端·c++·python·selenium
茉莉玫瑰花茶36 分钟前
floodfill 算法(dfs)
算法·深度优先
CoderCodingNo1 小时前
【GESP】C++五级考试大纲知识点梳理, (5) 算法复杂度估算(多项式、对数)
开发语言·c++·算法
星河队长1 小时前
VS创建C++动态库和C#访问过程
java·c++·c#
MYX_3092 小时前
第三章 线型神经网络
深度学习·神经网络·学习·算法
沐怡旸3 小时前
【穿越Effective C++】条款02:尽量以const, enum, inline替换#define
c++·面试
坚持编程的菜鸟3 小时前
LeetCode每日一题——三角形的最大周长
算法·leetcode·职场和发展
给大佬递杯卡布奇诺3 小时前
FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析
c++·ffmpeg·音视频
QT 小鲜肉3 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
看到我,请让我去学习3 小时前
Qt 控件 QSS 样式大全(通用属性篇)
开发语言·c++·qt