埃氏筛_四种形式 ( pass even , bool , char , differently judge )

目录

埃氏筛 ( pass even )

埃氏筛 ( char ) 

埃氏筛 ( bool ) _true is prime

埃氏筛 ( bool ) _false is prime


//
埃氏筛
01  如果 数字 i 没被筛 就可以说明 它是素数 ( 不是2到i-1任何数字的倍数 )
02  试除法判断质数时 循环边界应写成 i <= N/i
        (1) i <= sqrt(N) 效率较低
        (2) i*i <= N 当N接近int上限时 i*i 会溢出为负数

//
埃氏筛
01 素数a * 素数b 或 素数a * 合数b 结果一定是合数

02 因此我们从2开始 将其倍数标记为合数 直到出界

03 第二次操作 从未被标记的数中 选取最小的数开始
    ( 该数一定是素数 因为合数存在唯一质数分解 它的质因子使得他一定会在之前被标记 )

04 如此循环 未标记的最小数 直到出界

埃氏筛 ( pass even )

// 埃氏筛 ( pass even )
typedef long long ll;
const ll MAXN=10005;

char judge[MAXN];
ll prime[MAXN];

// 0 is prime
void sieve( ll n )
{
    ll temp=(ll)sqrt(n),i,j;

    memset( judge,0,sizeof( judge ) );

    for( i=3;i<=temp;i+=2 )
    {
        if( !judge[i] ) for( j=i*i;j<=n;j+=i ) judge[j]=1;
    }
}

ll prime_cnt( ll n )
{
    ll i,cnt=1;
    prime[0]=2;

    for( i=3;i<=n;i+=2 ) if( !judge[i] ) prime[cnt++]=i;
    return cnt;
}

埃氏筛 ( char ) 

// 埃氏筛 ( char ) 
typedef long long ll;
const ll MAXN=10005;

char judge[MAXN];
ll prime[MAXN];

// 1 is prime
ll sieve( ll n )
{
    ll cnt=0,i,j;

    memset( judge,1,sizeof( judge ) );
    // judge[0]=judge[1]=0;    

    for( i=2;i<=n;i++ )
    {
        if( judge[i] )                          // 起初 默认所有值都为素数
        {
            prime[cnt++]=i;                     // 记录素数 和 素数个数
            for( j=i*i;j<=n;j+=i ) judge[j]=0;  // 筛去 素数 倍数
            // j=i*i
        }
    }
    return cnt;
}

埃氏筛 ( bool ) _true is prime

//  埃氏筛 ( bool ) 
typedef long long ll;
const ll MAXN=10005;

bool judge[MAXN];
ll prime[MAXN];

// true is prime
ll sieve( ll n )
{
    ll cnt=0,i,j;

    memset( judge,true,sizeof( judge ) );
    // judge[0]=judge[1]=false;    

    for( i=2;i<=n;i++ )
    {
        if( judge[i] )  // 起初 默认所有值都为素数
        {
            
            prime[cnt++]=i;     // 记录素数 和 素数个数

            for( j=i*i;j<=n;j+=i ) judge[j]=false;  // 筛去 素数 倍数
        }
    }
    return cnt;

}

埃氏筛 ( bool ) _false is prime

// 埃氏筛 ( bool )
typedef long long ll;
const ll MAXN=10005;

bool judge[MAXN];
ll prime[MAXN];

// false is prime
ll sieve( ll n )
{
    ll cnt=0,i,j;

    memset( judge,false,sizeof( judge ) );

    for( i=2;i<=n;i++ )
    {
        if( judge[i] ) continue;                    // true 1 合数

        prime[cnt++]=i;                             // 记录素数 和 素数个数

        for( j=i;j<=n/i;j++ ) judge[ i*j ]=true;    // 筛去 素数 倍数
    }
    return cnt;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这题AC再睡.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值