zoukankan      html  css  js  c++  java
  • 线性筛素数

    给定一个整数 \(n\) ,求出 $[2,n] $ 之间的所有素数。

    prime 数组存放已经筛出的素数, \(m\) 代表素数个数(也就是说遍历时从 \(1\) 遍历到 \(m\) 即可),v 数组代表有没有被标记,避免重复筛。

    int v[maxn], prime[maxn], n, k, t, m;
    void primes(int n)
    {
        memset(v, 0, sizeof(v)); //清空标记数组
        m = 0;                   //质数个数
        for (int i = 2; i <= n; i++)
        {
            if (!v[i])                    //未被标记,i为质数
                v[i] = i, prime[++m] = i; //记录
            for (int j = 1; j <= m; j++)
            {
                if (prime[j] > v[i] || prime[j] > n / i)
                    break;                  //i有更小的质因子,或者超出n的范围
                v[i * prime[j]] = prime[j]; //prime[j]为合数 i*prime[j]的最小质因子
            }
        }
    }
    int main()
    {
        scanf("%d", &n);
        primes(n);
        for (int i = 1; i <= m; ++i)
            printf("%d\n", prime[i]);
    }
    
  • 相关阅读:
    基础数据类型补充
    编码转换
    is 和 == 的区别
    字典 dict
    列表与元组
    python基础第一节
    poll函数
    基本 TCP 的回射服务器
    文件IO
    base | AtomicIntegerT类
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/14948637.html
Copyright © 2011-2022 走看看