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
  • 相关阅读:
    H面试程序(0):字符串一些常用函数的实现
    ctype.h头文件
    poj 3657
    UVA10294项链和手镯(等价类计数问题)
    UVA11375火柴(递推+大数)
    UVA11375火柴(递推+大数)
    UVA11388GCD LCM
    UVA11388GCD LCM
    UVA10943简单递推
    UVA10943简单递推
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/9351662.html
Copyright © 2011-2022 走看看