2016.1.26
试题描述
|
给定两个正整数 a 和 b,请你统计区间 [a,b) 内有多少个素数。 |
输入
|
共一行包含两个正整数 a 和 b,用一个空格分隔开。
|
输出
|
一个数,表示所给区间内的素数的个数。
|
输入示例
|
22 37
|
输出示例
|
3
|
其他说明
|
数据范围:1≤ a < b ≤ 10^12 , b-a ≤ 10^7 。
样例说明:有23、 29 和 31 共 3 个素数。 |
区间筛嘛~随便筛~就是当年写的代码比较难看ಥ_ಥ
#include<iostream> #include<cmath> using namespace std; long long a,b; int mark[1000005],prime[1000005],e,bl[10000005]; int main() { scanf("%lld%lld",&a,&b); for(int i=2;i<=1000000;i++) { if(!mark[i]) { prime[++e]=i; for(long long j=(long long)i*i;j<=1000000;j+=i) { mark[j]=1; } } } long long xxx,c; for(int i=1;i<=e;i++) { xxx=(long long)ceil(1.0*a/prime[i]); if(xxx==1) xxx++; for(long long j=xxx;(c=j*prime[i])<b;j++) { bl[c-a]=1; } } int ans=0; c=b-a; for(int i=0;i<c;i++) { if(!bl[i]) ans++;//cout<<i+a<<" "; } if(a==1) ans--; printf("%d",ans); }