求素数
Time Limit: 100ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
求小于n的所有素数的数量。
输入
多组输入,输入整数n(n<1000000),以0结束。
输出
输出n以内所有素数的个数。
示例输入
10 0
示例输出
4
///wa了好久的题0.0 今天突然想起来了0.0 不能直接求素数的个数 会超时
///首先需要预处理,利用欧拉筛原理预处理 bool 数组保存是否为素数 最后遍历加和输出素数的个数
///Accode
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1000010;
int prime[maxn];
bool vis[maxn] = {0}; ///vis[]=0 是素数
void Oula_prime()
{
int i,j;
int k = sqrt(maxn+1); ///开方处理
for(i=2;i<=k;i++)
{
if(vis[i] == 0)
{
for(j=i;i*j<=maxn;j++)
{
vis[i*j] = 1;
}
}
}
int sum = 0;
for(i=2;i<=maxn;i++)
{
if(vis[i] == 0)
{
sum++;
}
prime[i] = sum;
}
}
int main()
{
int n;
Oula_prime();
while(cin>>n&&n)
{
cout<<prime[n]<<endl;
}
return 0;
}
///更新于17/1/15
进一步降低了欧拉筛的时间复杂度O(nlogn)