导航

区间内素数的个数

Posted on 2016-01-26 09:14  POOH1DROSE  阅读(1172)  评论(0编辑  收藏  举报

2016.1.26

 

 

试题描述

给定两个正整数 a 和 b,请你统计区间 [a,b) 内有多少个素数。

输入
共一行包含两个正整数 a 和 b,用一个空格分隔开。
输出
一个数,表示所给区间内的素数的个数。
输入示例
22 37
输出示例
其他说明
数据范围: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);

}
View Code