又见素数
题目描述
给定一个正整数n(n <= 10000000),求n(包含)以内素数的个数。
输入
第一行为一个整数t(t <= 1000),表示测试数据的组数。 接下来有t行,每行一个整数n。
输出
对于每个n,求n以内素数的个数。
样例输入
2510
样例输出
34
思路:
以打表的形式来减少时间,一开始未用数组将素数的个数储存起来,直接每输入一个m就for一次枚举出来,结果超时了。之后再定义一个数组b【T】将素数个数存储起来,结果内存超限。后来直接用回原来的a【T】数组后就AC了。
#include<iostream>
#include <cmath>
using namespace std;
const int T = 10000001;
int a[T];
int main()
{
int i, j,n,m,sum;
for (i = 2; i <= sqrt(T);++i)
{
if (a[i]!=1)
{
for (j = i+i; j <= T;j+=i )
{
a[j] = 1;
}
}
}
for (i = 2,sum=0; i <= T; ++i)
{
if (a[i]!=1)
{
sum++;
}
a[i] = sum;
}
scanf("%d",&n);
while (n--)
{
scanf("%d", &m);
printf("%d\n", a[m]);
}
return 0;
}