Description
给定一个正整数n(n <= 10000000),求n(包含)以内素数的个数。
Input
第一行为一个整数t(t <= 1000),表示测试数据的组数。接下来有t行,每行一个整数n。
Output
对于每个n,求n以内素数的个数。
Sample Input
2
5
10
思路:
考虑到内存大小先声明一个char类型的大数组a[maxn]然后全面置0
再另外声明一个int 类型的大数组b[maxn]也置0
利用for循环先将奇数置为1;
然后筛选不是素数的奇数将其置为0;(素数的倍数不是素数)
代码如下:
#include<iostream>
using namespace std;
#define N 10000005
char isprime[N + 1] = { 0 };
int Num[N + 1] = { 0 };
int main()
{
isprime[2] = 1;//2为素数
for (int i = 3; i<= N; i+= 2)//筛选奇数
{
isprime[i] = 1;
}
for (int i = 3; i*i < N; i += 2)//素数的倍数不是素数
{
if (isprime[i])
{
for (int j = i*i; j<=N; j += 2 * i)
{
isprime[j] = 0;
}
}
}
Num[2]= 1;
for (int i = 3; i <= N; i++)
{
Num[i] = Num[i - 1];
if (isprime[i])Num[i]++;//遇到素数个数+1
}
int n, t;
cin >> t;
while (t--)
{
int p = 1;
cin >> n;
cout << Num[n]<< endl;
}
return0;
}