P1835 素数密度_NOI导刊2011提高(04)

题目描述

给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数。

输入输出格式

输入格式:

 

两个数L和R。

 

输出格式:

 

一行,区间中素数的个数。

 

输入输出样例

输入样例#1:
2 11
输出样例#1:
5

AC代码:

#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e6+100;
int ans,l,r,k1,k2,L;//k1,k2是为了以一次除法代替大量乘法运算
bool f,check[N];
int main(){
    scanf("%d%d",&l,&r);
    L=r-l+1;
    if(l<2) l=2;
    k1=sqrt(r+0.5);
    for(int j,i=2;i<=k1;i++){
        if(i>=l&&check[i-l]) continue;
        k2=r/i;
        f=1;
        for(j=l/i;j<=k2;j++) if(j>1){
            if(f&&i*j<l){f=0;continue;}//f是为了防止i*j-l<0致使数组溢出,只判一次节省时间
            check[i*j-l]=1;
        }
    }
    for(int i=0;i<L;i++) if(!check[i]) ans++;
    printf("%d",ans);
    return 0;
} 

 

posted @ 2016-11-11 14:55  神犇(shenben)  阅读(289)  评论(0编辑  收藏  举报