埃氏筛算法

输入一个正整数n(n>=2),q求n以内的所有的质数有多少个?

 

比如:输入n=10,输出4

 

 

1.使用暴力枚举法

int n=1e4      1229 16ms

int n=1e5      9592  1184ms 11秒

int n=1e6      78498 96908ms  96秒

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5 bool isPrime(int n) {
 6     for (int i = 2; i < n; ++i) {
 7         if (n % i == 0)return 0; //TODO
 8     }
 9     return 1;
10 }
11 int main() {
12     int N = 1e6, counter = 0;
13 //    printf("%d",N);
14     double beginTime = clock();
15     for (int i = 2; i < N; ++i) {
16         if (isPrime(i))counter++;
17     }
18     double endTime = clock();
19     printf("%d个\n", counter);
20     cout << endTime - beginTime;
21 }

 2.平方根算法

 1 bool isPrime1(int n){
 2     for(int i=2;i<sqrt(n);++i){
 3         if (n % i == 0)return 0;//TODO
 4     }
 5     return 1;
 6 }
 7 
 8 int main() {
 9     int N = 1e5, counter = 0;
10 //    printf("%d",N);
11     double beginTime = clock();
12     for (int i = 2; i < N; ++i) {
13         if (isPrime1(i))counter++;
14     }
15     double endTime = clock();
16     printf("%d个\n", counter);
17     cout << endTime - beginTime<<"ms";
18 }

3.埃氏筛算法

int isPrime2(int n) {
    // 创建一个布尔类型的向量is_prime,大小为n+1,初始值为true
    // 表示从0到n的每个数都被标记为质数(默认假设所有数都是质数)
    vector<bool> is_prime(n + 1, true);
    
    // 将0和1标记为非质数,因为它们不是质数
    is_prime[0] = false;
    is_prime[1] = false;
    
    // 用于计数小于n的质数个数
    int counter = 0;
    
    // 外层循环从2开始,直到sqrt(n),因为大于sqrt(n)的数已经不可能再标记其他数为非质数
    for (int j = 2; j <= sqrt(n); ++j) {
        // 如果当前数j是质数
        if (is_prime[j] == true) {
            // 内层循环从j的平方开始,逐个标记j的倍数为非质数
            for (int m = j * j; m < n; m += j) {
                is_prime[m] = false;
            }
        }
    }
    
    // 遍历从2到n-1的所有数,统计质数的个数
    for (int i = 2; i < n; ++i) {
        if (is_prime[i] == true) 
            counter++;
    }
    
    // 返回小于n的质数个数
    return counter;
}
int main() {
    int N = 1e5, counter = 0;
//    printf("%d",N);
    double beginTime = clock();
    for (int i = 2; i < N; ++i) {
        if (isPrime1(i))counter++;
    }
    double endTime = clock();
    printf("%d个\n", counter);
    cout << endTime - beginTime<<"ms";
}

 

posted @ 2025-02-09 15:40  SIPnnnnn  阅读(10)  评论(0)    收藏  举报