当前位置: 代码迷 >> 综合 >> 埃氏筛_四种形式 ( pass even , bool , char , differently judge )
  详细解决方案

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

热度:13   发布时间:2023-12-06 05:46:32.0

目录

埃氏筛 ( 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;
}

  相关解决方案