欧拉筛(求素数)+框架代码注释

本文介绍了一种比埃氏筛法更高效的筛选素数的方法——欧拉筛法。通过遍历并标记合数,避免了重复筛选,优化了时间复杂度为O(n)。代码示例展示了如何用C++实现该算法,适用于求解一定范围内的素数。

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

时间复杂度:O(n)

特点:对每个合数只进行一次,筛选效率高于埃氏筛法

#include <iostream>
#include<string.h>
using namespace std;

const int maxn=100;
int prime[maxn];//存储素数
bool visit[maxn];//标志下标i是否为素数
void euler(int n){
    int num=0;//第几个素数
    memset(visit,true,sizeof(visit));//首先全部置为素数
    for (int  i = 2; i <= n; i++)
    {
        if (visit[i])//如果是素数,存入prime
        {
            prime[++num]=i;
        }
        for (int j =1; j <=num&&i*prime[j]<maxn; j++)//枚举num以内的素数,素数*倍数=合数
        {
            visit[i*prime[j]]=false;
            if(i%prime[j]==0)break;//避免重复筛选
            /* 
            num=1 i=2 -- 2*2=4
            num=2 i=3 -- 3*2=6,3*3=9 
            num=2 i=4 -- 4*2=8 剪枝否则筛选 4*3=12
            num=3 i=5 -- 5*2=10 5*3=15 5*5=25
            num=3 i=6 -- 6*2=12 剪枝否则筛选 6*3=18 6*5=30 , 当i=9和15时会进行筛选,避免重复
            */
        }
        
    }
    
}
int main(){
    int n;
    cin>>n;
    euler(n);
    for (int i = 1; i < 20; i++)
    {
        cout<<prime[i]<<"  ";
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值