下面是题目的网址。
acm.zzuli.edu.cn/problem.php?id=1369
题目描述
继续来研究素数的问题,这次我们来统计素数的个数,给出一个区间[a,b],统计区间内的素数的个数。
输入
输入包含多个测试实例,两个正整数a,b(1<=a<=b<=2000000),统计[a,b]区间素数的个数。
输出
每个实例输出占一行,区间内素数的个数。
样例输入
1 2000000
样例输出
148933
思路
用埃氏筛法将素数挑出,然后用数组将素数存入,我用的是遍历,如果用二分应该可以更快。
埃氏筛法的链接
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int i,s[2000006]; // 数组s用来存是素数的数字。
bool t[2000006];
int main()
{
memset(t,true,sizeof(t));
t[1]=false; //1不是素数。
int j=0;
int z;
for(i=2;i<=2000000;i++) //打表用埃式筛法将不是素数的bool值改为false。
{
if(t[i]==true)
{
for(z=2; i*z<=2000000; z++)
{
t[i*z]=false;
}
s[j]=i;
j++;
}
}
s[j]=20000000;
j++;
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
int ans=0;
for(i=0;i<j;i++) //此处用二分更好,时间更快。适合范围更大的题目。
{
if(s[i]>=x&&s[i]<=y)
ans++;
if(s[i]>y) //注意这个break。 不加时间就会超限。
break;
}
printf("%d\n",ans);
}
return 0;
}