2018-03-08 素数筛选

// 埃氏筛法
//  小范围的求解素数 su[i]保存第i个素数,下标是从1开始
#define MAX 100000    //求MAX范围内的素数
long long su[MAX],cnt;
bool isprime[MAX];
void prime()
{
    cnt=1;
    memset(isprime,1,sizeof(isprime)); //初始化认为所有数都为素数
    isprime[0]=isprime[1]=0;  //0和1不是素数
    for(long long i=2;i<=MAX;i++)
    {
        if(isprime[i])
            su[cnt++]=i;//保存素数i 下标是从1开始
        for(long long j=1;j<cnt&&su[j]*i<MAX;j++)
        {
            isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数
        }
    }
}
//求一个特定的区间 (a<=x<b) 内的素数的个数
#include<iostream>
#include<stdio.h>
typedef long long ll;
using namespace std;
bool is_prime_small[1000009];
bool is_prime[1000009];
///对区间[a,b)内的整数进行筛选。 is_prime[i-a]=true <=> i是素数

void segment_sieve(ll a,ll b)
{
    for(int i=0;(ll)i*i<b;i++)
        is_prime_small[i]=true;
    for(int i=0;i<b-a;i++)
        is_prime[i]=true;
    for(int i=2;(ll)i*i<b;i++)
        if(is_prime_small[i])
        {
            for(int j=2*i;(ll)j*j<b;j+=i)
                is_prime_small[j]=false;
            for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i)
                is_prime[j-a]=false;
        }
}
int main()
{
    ll a,b,c;
    scanf("%lld%lld",&a,&b);
    segment_sieve( a, b);
    int ans=0;
    c=b-a;
    for(int i=0;i<c;i++)
    {
        if(is_prime[i]) ans++;//cout<<i+a<<" ";
    }
    if(a==1) ans--;
    printf("%d",ans);
    return 0;
}

//不是很懂这种筛法 这个比上面优化一些

const int N = 1000000 + 5;
int prime[N], check[N];

memset(prime, 0, sizeof(prime));
memset(check, 0, sizeof(check));
int ptot = 0;
for(int i = 2; i <= n; i ++){
    if(!check[i]) prime[ptot ++] = i;
    for(int j = 0; j < ptot; j ++){
        if(prime[j] * i > n) break;
        check[prime[j] * i] = 1;
        if(i % prime[j] == 0) break;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 没有灿烂的阳光,就没有温暖的万物;没有雨露的滋润,就没有五谷的丰登;没有辛酸坎坷的磨练,就没有意志坚强的精神;没有...
    落羽成霜彡阅读 716评论 0 7
  • “建立静脉通路。” “一百毫升生理盐水!” “给氧,进行血氧监测!” “采血配型,调两个单位全血。” “角膜反射、...
    水影晃树阅读 286评论 0 5
  • 1、该走哪条路 每条路都布满荆棘 该做怎样的决定 每个决定都是一次袭击 该如何忘记这段情 怎么忘都是深深伤害自己 ...
    三生若尘阅读 327评论 0 1
  • 猪肉,总是让人充满想象。无论是猪身上的哪个地方,但凡能吃的都能做上美美的一餐。朋友知道我会做饭,来到我家啥也不吃指...
    食趣菜菜屋阅读 421评论 2 8