#include <iostream>
#include <cstring>
using namespace std;
int main(void)
{
int n = 0;
int cnt = 0;
int prime[10000] = {0}; //prime保存的是素数, 其最终为prime={2, 3, 5, 7, ...}
bool vis[10000] = {false}; //vis保存的是对于连续的自然数, 其是否是素数的一个判断, eg:vis[0]=false; vis[1]=false;vis[2]=true;...
cin >> n;
for (int i=2; i<=n; i++)
{
if (vis[i] == false) //如果i是素数
{
prime[cnt++] = i; //i保存到prime[cnt], 同时cnt加1
}
for (int j=0; j<cnt && i*prime[j]<=n; j++)
{
vis[i*prime[j]] = true; //如果prime[j]是素数, 那么i*prime[j]就不是素数,
if (i%prime[j] == 0) //如果i是prime[j]的倍数(i == prime[j]*?), 那么i*prime[j+1] == prime[j]*?*prime[j+1], 这条语句是为了减少判断次数, 及时跳出循环
{
break;
}
}
}
cout << cnt << endl;
return 0;
}
欧拉筛法-线性筛素数
最新推荐文章于 2024-07-08 07:52:22 发布