Description
Given an integer interval [L, R](L <= R <= 2147483647, R - L <= 1000000), please calculate the number of prime(s) in the interval.
InputThere is one line in the input, which contains two integer: L, R.
OutputThere is only one line , which contains the number of prime(s) in the interval.
Sample Input2 11Sample Output
5
#include<iostream> #include<algorithm> #include<cmath> using namespace std; const int MAXN = 50000; const int MAXM = 1e6 + 10; typedef long long ll; int isprime[MAXN]; //小数字素数判定 int isprimeB[MAXM]; //大数素数判定 ll prime[MAXN]; //小素数 ll primeB[MAXM]; //大素数 int cnt,cntB; void getP() //线性素数筛,比普通筛更快 { for(int i = 1; i < MAXN; i++) isprime[i] = 1; for(int i = 2; i < MAXN; i++) { if(isprime[i]) { prime[cnt++] = i; } for(int j = 0; j < cnt&&prime[j] * i < MAXN; j++) //采用最小质因子和剩余质因子积的策略来筛 { isprime[prime[j] * i] = 0; if(i%prime[j] == 0) break; } } } void getIntP(ll a,ll b) //区间素数筛 { for(int i = 0; i <= b - a; i++) isprimeB[i] = 1; int k; for(int i = 0; i < cnt&&prime[i]*prime[i]<=b; i++) { k = a / prime[i]; if(k*prime[i] < a) k++; //求>=a的第一个素数 if(k <= 1) k++; //如果k==1则表示是第一个质数,当然不能筛掉,事实上k不可能等于0 while(k*prime[i] <= b) { isprimeB[k*prime[i] - a] = 0; //筛着走 k++; } } cntB = 0; for(int i = 0; i <= b - a; i++) { if(isprimeB[i]) primeB[cntB++] = i + a; } } int main() { ll a, b; getP(); while(cin >> a >> b) { ll ans = 0; if(b < MAXN) { for(int i = a; i <= b; i++) if(isprime[i]) ans++; } else { cntB = 0; getIntP( a, b ); for(int i = 0; i <= b - a;i++) if(isprimeB[i])ans++; } cout << ans << endl; } return 0; }
解题报告 之 HOJ2276 SOJ2498 Count prime
原文:http://blog.csdn.net/maxichu/article/details/45607699