美文网首页
2018-03-08 素数筛选

2018-03-08 素数筛选

作者: _弓长_大人 | 来源:发表于2018-09-25 12:46 被阅读12次
// 埃氏筛法
//  小范围的求解素数 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;
    }
}

相关文章

  • 2018-03-08 素数筛选

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

  • Algorithm

    素数筛选

  • 素数筛选

    今天在面试时被问到了一个问题:求不大于n的最大素数,当时只想出暴力解法,回来查资料找到了正确的求解方法。 素数筛法...

  • 筛选素数/筛选质数

  • 区间素数线性筛选

    区间素数线性筛选 假设应用场景为求一个区间长度远小于右端点的所有素数,该区间为 。如若使用朴素素数线性筛选,则需...

  • 素数线性筛选

    素数线性筛选 素数的定义是除了1和自身能被整除外,没有其他数能被它整除。除此之外,1既不是素数,也不是合数。因此,...

  • 素数算法

    寻找素数的算法有很多,最著名应是筛选法,以下是笔者用JavaScript编写的一个找素数的函数,借鉴了各种找素数的...

  • 筛选法求素数

  • RSA加密解密算法—数论基础

    本章涉及知识点1、素数的定义2、寻找素数算法—短除法3、寻找素数算法—筛选法4、互质关系5、欧拉函数的证明6、欧拉...

  • 筛选N以内的素数

    1.题目描述用简单素数筛选法求N以内的素数。 2.格式与样例:输入格式N输出格式2~N的素数输入样例100输出样例...

网友评论

      本文标题:2018-03-08 素数筛选

      本文链接:https://www.haomeiwen.com/subject/icfufftx.html