#include <bits/stdc++.h>
using namespace std;
int x[2000001],y[2000001];
int main(){
int i;
for (i=2;i<=2000000;i++)x[i]=1;
for (i=2;i<=2000000;i++){
if (x[i]){
for (int j=2*i;j<=2000000;j+=i){
x[j]=0;
}
}
y[i]=y[i-1]+x[i];
}
int a,b;
while (scanf("%d %d",&a,&b)!=EOF){
cout<<y[b]-y[a-1]<<endl;
}
}
在本校oj网站上遇到的题,求[a,b] 里头的素数的个数,多组数据,且数据很大,只能建立个素数数组了,刚开始的想法是建立a[n] 表示第x(x<n) 个素数是a[x],很普通的方法,很不聪明的方法,太复杂力!!!!!
于是了解到了埃氏筛选法,首先储存方式和上面不一样,下标和储存的数据完全和上面的相反,a[n],储存的数为1表示该下标为素数,0则......,从2开始是个素数,2的所有小于边界的倍数都为0...........,确实哈呀一!!唯一的缺点可能是开的数组要很大,开了两个x[2000000] (下一段会讲到为啥要两个)
题目要求的是求区间素数的个数,相加就行了,第一次我是循环求和(真蠢,果然TLE了,然后我就想到了前缀和可以快速求前n项和,于是开了个y[2000000],求其前缀和。