zoukankan      html  css  js  c++  java
  • 线性复杂度的素数筛选法

    // #include"cstdio"
    // #include"cstring"
    // using namespace std;
    // #define maxn 100000//求maxn范围内的素数
    // long long su[maxn],cnt;
    // bool isprime[maxn];
    // void prime()
    // {
    //     cnt=1;
    //     memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数
    //     isprime[0]=isprime[1]=0;//0和1不是素数
    //     for(long long i=2;i<=maxn;i++)
    //     {
    //         if(isprime[i])//保存素数
    //         {
    //             su[cnt++]=i;
    //         }
    //         for(long long j=i*2;j<=maxn;j+=i)//素数的倍数都为合数
    //         {
    //             isprime[j]=0;
    //         }
    //     }
    // }
    // int main()
    // {
    //     prime();
    //     for(long long i=1;i<cnt;i++)
    //         printf("%d  ",su[i]);
    //     return 0;
    // }
    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 100000//求maxn范围内的素数
    long long su[maxn],cnt;
    bool isprime[maxn];
    void prime()
    {
        cnt=1;
        memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数
        isprime[0]=isprime[1]=0;//0和1不是素数
        for(long long i=2;i<=maxn;i++)
        {
            if(isprime[i])
                su[cnt++]=i;//保存素数i
                //下面这个循环的时间复杂度相比较于maxn可以忽略不计
            for(long long j=1;j<cnt&&su[j]*i<maxn;j++)
            {
                isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数
            }
        }
    }
    int main()
    {
        prime();
        for(long long i=1;i<cnt;i++)
            printf("%d  ",su[i]);
        return 0;
    }
    每一个不曾刷题的日子 都是对生命的辜负 从弱小到强大,需要一段时间的沉淀,就是现在了 ~buerdepepeqi
  • 相关阅读:
    受得了多大的委屈,才做得了多大的事
    黑客常用 Linux 入侵常用命令
    8年软件测试工程师感悟——写给还在迷茫中的朋友
    买or不买?如何测试博彩公司赔率是否合理?
    函数三
    函数二
    函数
    字符编码与文件的操作
    三、元组,字典、集合
    3.20学习内容,字符串与列表
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/9351662.html
Copyright © 2011-2022 走看看