埃氏筛算法

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

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

1.穷举法

1e4 1229 17ms 0.017s

1e5 9592 1270ms 1.270s

1e6 78498 102652ms 102.652s

穷举法

2.埃氏筛算法

1e4 1229 0.001s
1e5 9592 0.007s
1e6 78498 0.068s
1e7 664579 0.699s

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int isPrime(int n) {
 4     // 创建一个布尔类型的向量is_prime,大小为n+1,初始值为true
 5     // 表示从0到n的每个数都被标记为质数(默认假设所有数都是质数)
 6     vector<bool> is_prime(n + 1, true);
 7 
 8     // 将0和1标记为非质数,因为它们不是质数
 9     is_prime[0] = false;
10     is_prime[1] = false;
11 
12     // 用于计数小于n的质数个数
13     int counter = 0;
14 
15     // 外层循环从2开始,直到sqrt(n),因为大于sqrt(n)的数已经不可能再标记其他数为非质数
16     for (int j = 2; j <= sqrt(n); ++j) {
17         // 如果当前数j是质数
18         if (is_prime[j] == true) {
19             // 内层循环从j的平方开始,逐个标记j的倍数为非质数
20             for (int m = j * j; m < n; m += j) {
21                 is_prime[m] = false;
22             }
23         }
24     }
25 
26     // 遍历从2到n-1的所有数,统计质数的个数
27     for (int i = 2; i < n; ++i) {
28         if (is_prime[i] == true) 
29             counter++;
30     }
31 
32     // 返回小于n的质数个数
33     return counter;
34 }
35 int main(){
36     long long n;
37     cin>>n;
38     double go=clock();
39     cout<<n<<' '<<isPrime(n);
40     double stop=clock();
41     printf("\n%.0fms",stop-go);
42     return 0;
43 }
埃氏筛算法

 

posted @ 2025-02-09 16:38  TP_003  阅读(18)  评论(0)    收藏  举报