题目描述:
筛法求素数,指的是每次将一个素数的所有的倍数去掉,如果当前的数没有被比它小的数去掉过,那么当前的数就是素数。
比如1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1不是素数。不用管。
2是素数,那么2的所有的倍数要被去掉。
3是素数,那么3的所有的倍数要被去掉。
4 被去掉了。不用管。
。。。
这样做下去我们就可以筛选出所有的指定范围内的素数了。
你的任务是求小于等于n的素数的个数count。
输出格式:
对于每个询问n输出小于等于n的的素数的个数。
样例输入:
2 10 1000000
样例输出:
4 78498
解析代码:
使用两个数组,一个用来存放质数,一个用来存放素数的个数
#include<iostream>
using namespace std;
//T个询问,每次询问一个整数N,每次输出前N个数中素数的个数。T<=1亿 N<=1000000
int c[1000001]; //刚开始,所有数都标记为质数
int a[1000001]; //表示前N个数总共有多少个素数
int m=0;
int main()
{
//
for(int i=2;i<=1000000;i++)
{
if(c[i]==0) //if(!a[i])
for(int j=2*i;j<=1000000;j=j+i)
c[j]=1;
}
for(int i=2;i<=1000000;i++)
{
if(c[i]==0)
m++;
a[i]=m;
}
int T;
cin>>T;
int n;
for(int i=1;i<=T;i++)
{
cin>>n;
cout<<a[n]<<"\n";
}
return 0;
}