首页 > 其他分享 >取素数优化——埃拉托斯特尼筛法(Sieve of Eratosthenes)

取素数优化——埃拉托斯特尼筛法(Sieve of Eratosthenes)

时间:2024-06-10 11:43:52浏览次数:5  
标签:斯特尼 筛法 ll 素数 Sieve 埃拉托 Eratosthenes

埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种用来生成一定范围内所有素数的算法。其基本思想是从小到大遍历每个数,如果当前数是素数,则将其所有的倍数标记为非素数。这个过程中,所有未被标记为非素数的数即为素数。

下面是使用埃拉托斯特尼筛法来计算区间 [x, y] 内的素数个数的修改后的代码:

 
#include <iostream>
#include <vector>

typedef long long ll;

std::vector<bool> sieve_of_eratosthenes(ll n) {
    std::vector<bool> is_prime(n + 1, true);//建成一个bool型向量,并且从0一直到n+1都初始化为true
    is_prime[0] = is_prime[1] = false;//特殊的两个数,专门处理
    for (ll i = 2; i * i <= n; i++) {
        if (is_prime[i]) {//如果i,是素数了,那么i的n倍就不是素数了,通过这个循环,标记他们
            for (ll j = i * i; j <= n; j += i) {
                is_prime[j] = false;
            }
        }
    }
    return is_prime;
}

int main() {
    ll x, y;
    std::cin >> x >> y;
    std::vector<bool> primes = sieve_of_eratosthenes(y);//通过调用这个函数,得到一系列的是否为素数的状态,并储存点bool型向量里面
    ll count = 0;
    for (ll i = x; i <= y; i++) {
        if (primes[i]) count++;
    }
    std::cout << count << std::endl;
    return 0;
}

在这个代码中,我们首先定义了一个 sieve_of_eratosthenes 函数来生成素数筛。然后在主函数中,我们使用这个筛来计算区间 [x, y] 内的素数个数。这种方法的时间复杂度为 O(n log log n),比起简单的素数判断函数在处理大范围的区间时要高效得多。

标签:斯特尼,筛法,ll,素数,Sieve,埃拉托,Eratosthenes
From: https://www.cnblogs.com/sly-345/p/18240543

相关文章

  • 52 Things: Number 37: The Number Field Sieve
    52Things:Number37:TheNumberFieldSieve52件事:数字37:数字字段筛选 Thisisthelatestinaseriesofblogpoststoaddressthelistof'52ThingsEveryPhDStudentShouldKnowToDoCryptography':asetofquestionscompiledtogivePhDcandidates......
  • js找出一定范围内的全部素数(埃拉托斯特尼筛法Sieve of Eratosthenes)
    最近在看js的基础,看到函数这一章的时候,看到了这种写法。 原文链接:https://zh.javascript.info/function-basics突然懵了个B,js还能这么写。然后问了下chat,才想起来这是js的标签用法。在JavaScript中,标签(label)是一种标识符,用于标记代码中的特定位置,通常是在循环语句中使用。标......
  • 埃拉托斯特尼筛法——求1-n内质数个数的最快算法
    埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数......
  • 埃拉托斯特尼筛法(埃式筛,筛选数字n范围内的素数)
     古希腊数学家 埃拉托色尼/埃拉托斯特尼(Eratosthenes)除了在2000多年前就发现地球不是平的之外,还发明了本文中讨论的埃式筛(一种通过筛除一个素数所有的倍数,从而识别素数......