埃拉托色尼筛法(产生一个不大于给定整数n的连续质数序列)

本文介绍了埃拉托斯特尼筛选算法,用于生成小于给定整数n的连续质数序列,通过C++代码展示了如何使用该算法进行质数检测和输出,包括初始化、筛选过程和内存管理

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

埃拉托色尼筛选算法 用来产生一个不大于给定整数n的连续质数序列, 可应用于求质因数,其基本流程为:
  1. 初始化一个2~n的连续整数序列,作为候选质数;
  2. 消去2的倍数;
  3. 消去3的倍数;
  4. ... ...
  5. 注意判断循环条件(sqrt(n)向下取整),以及对已经消去数字的标记。
2345678910111213141516171819202122232425
235791113151719212325
2357111317192325
23571113171923

得到的质数序列为:{2,3,5,7,11,13,17,19,23}

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){

    // 埃拉托斯特尼筛法(筛选素数)
    ll N = 1000 * 10000; // 数组过大会溢出 
    int *a = NULL;
    a = (int*)malloc(sizeof(int)*N); // 动态申请内存可以防止数组过大的导致的内存溢出(开辟在堆区);直接int a[n]; 会开辟在栈区
    
    for(int i=2; i<N; i++){
        a[i] = i; // 初始化数组 
    }
    
    for(int i=2; i<sqrt(N); i++){ // 只需要从2筛到N^(1/2)就行了
        if(a[i] != 0){ // a[i]如果被筛掉了就设置为0
            int j = i*i; // 从当前数的平方开始筛
            while(j <= N){
                a[j] = 0;
                j = j + i; // 每次加上当前数,这样就相当于j = i*(i+1),都是i的倍数
            }
        }
    }
    
    int m = 0; // 记录共有多少个素数
    cout << "素数序列:"; 
    for(int i=2; i<N; i++){
        if(a[i] != 0){
            cout << a[i] << ' '; // 输出素数序列
            m++;
        }
    }
    cout << "\n\n素数个数为:" << m; 
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀客塔Ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值