埃氏筛算法
输入一个正整数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"; }
浙公网安备 33010602011771号