求素数的个数。本题要求编写一个程序,求1~n的素数个数。 要求至少给出两种解法,对
时间: 2024-06-07 08:12:21 浏览: 88
算法课设--求素数问题
5星 · 资源好评率100%
的算法。
解法一:暴力枚举法
对于每个数i,从2到i-1枚举,判断是否能被整除,如果都不能被整除,则i为素数。
代码如下:
```
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cnt = ;
for (int i = 2; i <= n; i++) {
bool flag = true;
for (int j = 2; j < i; j++) {
if (i % j == ) {
flag = false;
break;
}
}
if (flag) cnt++;
}
cout << cnt << endl;
return ;
}
```
解法二:埃氏筛法
从2开始,将每个素数的倍数都标记成合数,直到筛完所有小于n的数。标记过程中,如果当前数已经被标记,则跳过。
代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100001;
int primes[N], cnt;
bool st[N];
int main() {
int n;
cin >> n;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
primes[cnt++] = i;
for (int j = i + i; j <= n; j += i) {
st[j] = true;
}
}
}
cout << cnt << endl;
return ;
}
```
对于n=100000的情况,暴力枚举法需要运行约2.5秒,而埃氏筛法只需要运行约.02秒,效率明显更高。因此,我们可以得出结论:在求解素数个数的问题中,埃氏筛法是更好的算法。
阅读全文