埃氏筛算法
输入一个正整数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 }

浙公网安备 33010602011771号