题目描述 Description
给定区间[L, R](L <= R <= 2147483647,R-L <= 1000000),请计算区间中素数的个数。
输入描述 Input Description
两个数L和R
输出描述 Output Description
一行,区间中素数的个数
样例输入 Sample Input
2 11
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
详见试题
#include<cstdio> #include<iostream> #include<cmath> using namespace std; int l,r,f[1100000]={0},a[1100000],ans=0;//重要的事情说三遍,数组开大点,数组开大点,数组开大点!(找了一晚上错误,就是找不到错误,马丹,最后发现数组开小了,明明我是卡着点开的数组) int su(int x) { if (x==2) return 1; for (int i=2;i<=ceil(sqrt(x));i++) if (x%i==0) return 0; return 1; }//判断是不是素数 void pc(int x) { int q=l/x; int s=l%x; int h=r/x; for (int j=0;j<=h-q;j++) f[x-s+x*j]=1; if (q==0) f[x-s]=0; if (q>1&&s==0) f[0]=1; }//筛子,筛掉所有素数的倍数 int main() { scanf("%d%d",&l,&r); for (int i=0;i<=r-l;i++) a[i]=l+i; for (int i=2;i<=ceil(sqrt(r));i++) if (su(i)) pc(i); if (a[0]==0||a[0]==1) f[0]=1; if (a[1]==0||a[1]==1) f[1]=1; for (int i=0;i<=r-l;i++) if (not f[i]) ans++; printf("%d",ans); return 0; }