【金凌模拟试题】:素数密度
Time Limit:10000MS Memory Limit:65536K
Total Submit:20 Accepted:3
Case Time Limit:1500MS
Description
- 问题描述
给定区间[L, R](L <= R <= 2147483647,R-L <= 1000000),请计算区间中素数的个数。
Input
两个数L和R。
Output
一行,区间中素数的个数。
Sample Input
2 11
Sample Output
5
需要 筛选法求素数和 将数组平移。
下面是 AC代码:
#include<iostream> #include<cmath> using namespace std; bool f[100009],ff[5000009]; int main() { int l,r; int i,j,ans,ll,rr,n; memset(f,1,sizeof(f)); memset(ff,1,sizeof(ff)); cin>>l>>r; ans=0; n=50000; f[1]=0; for(i=2;i<=sqrt(n);i++) for(j=2;j<=n/i;j++) if(f[i]) f[i*j]=0; if(r<=50000) { for(i=l;i<=r;i++) if(f[i]) ans++; printf("%d\n",ans); return 0; } if(l<=50000) { for(i=l;i<=50000;i++) if(f[i]) ans++; l=50001; } for(i=1;i<=50000;i++) if(f[i]) { ll=l/i; rr=r/i; for(j=ll;j<=rr;j++) ff[i*j-l+1]=0; } for(i=1;i<=r-l+1;i++) if(ff[i]) ans++; printf("%d\n",ans); return 0; }