题目描述
求小于n的所有素数的数量。
输入
多组输入,输入整数n(n<1000000),以0结束。
输出
输出n以内所有素数的个数。
示例输入
10 0
示例输出
4
感觉一般做法肯定会TLE,在此推荐欧拉筛法,时间复杂度O(nloglogn);很快,但是内存有一点大。
#include<stdio.h>
#include<string.h>
#define max 1000000
int prime[max/3];
bool flog[max];//只存在一真一假
void getprime()
{
int k=0;
for(int i=2;i<max;i++)
{
if(!flog[i])prime[k++]=i;//若没被标记成true,则为素数,进入数组。
for(int j=0;j<k&&i*prime[j]<max;j++)//&&后面的条件表示比max大的数不用判断,不再范围内。
{
flog[i*prime[j]]=true;//重点:每个素数的倍数肯定不是素数。
if(i%prime[j]==0)break;/*重点:当 i 能整除 prime[j],那么 i*prime[j+1] 这个合数
肯定被 prime[j] 乘以某个数(比i大)筛掉。
因为i中含有prime[j], prime[j] 比 prime[j+1] 小。
/接下去的素数同理。所以不用筛下去了*/
}
}
}
int main()
{
int n;
while(~scanf("%d",&n),n!=0)
{
int c=0;
memset(flog,false,sizeof(flog));//初始化为false
getprime();
for(int i=2;i<n;i++)
{
if(flog[i]==false)
{
c++;
}
}
printf("%d\n",c);
}
return 0;
}