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); }
时间: 2024-10-06 01:11:16