2 埃氏筛法 求素数

本文介绍了一种用于筛选素数的算法实现,通过初始版本到优化版本的对比,展示了如何高效地找出一定范围内的所有素数。优化后的算法采用埃拉托斯特尼筛法原理,并在循环条件上进行了改进。

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

初始版本:

int prime[SIZE];            // 第i个素数
bool is_prime[SIZE];    //true表示i是素数

int slove(int n) {
    int p = 0;
    for(int i = 0; i <= n; i++)
        is_prime[i] = true;             //初始化
    is_prime[0] = is_prime[1] = false;      //0,1不是素数
    for(int i = 2; i <= n; i++) {
        if(is_prime[i]) {
            prime[p++] = i;             //计算素数的个数,也记录下了素数
            for(int j = 2 * i; j <= n; j += i)      // 除掉了i的倍数的数字
                is_prime[j] = false;
        }
    }
    return p;
}

优化后:

#include<cstdio>
const int N = 100000 + 5;
bool prime[N];
void init() {
    for(int i = 2; i < N; i++) prime[i] = true;
    for(int i = 2; i * i < N; i++) {//判断改成i*i<N 
        if(prime[i]) {
            for(int j = i * i; j < N; j += i) {//从i*i开始就可以了 
                prime[j] = false;  
            }
        }
    }
}
int main(){
    init();
}

 

 

### C++ 实现埃氏筛法素数 以下是基于埃氏筛法原理编写的 C++ 示例代码,能够高效地找到指定范围内所有素数: ```cpp #include <iostream> #include <vector> using namespace std; // 定义函数 sieveOfEratosthenes 来实现埃氏筛法 vector<int> sieveOfEratosthenes(int n) { vector<bool> prime(n + 1, true); // 初始化布尔数组,默认全部为素数 prime[0] = prime[1] = false; // 0 和 1 非素数 for (int p = 2; p * p <= n; p++) { // 只需遍历至 sqrt(n) if (prime[p]) { // 如果当前数是素数 for (int i = p * p; i <= n; i += p) { // 将其倍数标记为非素数 prime[i] = false; } } } vector<int> primes; // 存储最终的素数列表 for (int p = 2; p <= n; p++) { if (prime[p]) primes.push_back(p); } return primes; } int main() { int n; cout << "Enter the upper limit to list all prime numbers: "; cin >> n; vector<int> primes = sieveOfEratosthenes(n); cout << "Prime numbers up to " << n << ": "; for (int prime : primes) { cout << prime << " "; } cout << endl; return 0; } ``` 上述代码实现了埃氏筛法的核心逻辑[^1]。通过创建一个布尔数组 `prime` 表示每个数的状态(是否为素数),并逐步将已知素数的倍数标记为非素数。 #### 关键点解析 - **初始化布尔数组**:初始假设所有大于等于 2 的数都是素数。 - **优化循环条件**:只需检查到 \( \sqrt{n} \),因为更大的因数必然有对应的小于 \( \sqrt{n} \) 的配对因子。 - **减少冗余计算**:从 \(p^2\) 开始标记倍数,而非从 \(2p\) 开始,进一步提升效率[^4]。 --- ### 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值