ACM相关有关问题 筛素数算法(均摊的Eratosthenes筛 + 常数优化)
ACM相关问题 筛素数算法(均摊的Eratosthenes筛 + 常数优化)
筛素数算法(均摊的Eratosthenes筛 + 常数优化)
不是很懂这段代码 求大虾指导
#include<stdio.h>
#include<string.h>
#define MAX 40
bool flag[MAX] ;
int prime[MAX/2] ;
void get_prime( int &k )
{
memset(flag , true , sizeof (flag) ) ;
int i , j ;
for ( i = 2 ; i < MAX ; i ++ )
{
if ( flag[i] ) prime[k++] = i ;
for ( j = 0 ; j < k && i * prime[j] < MAX ; j ++ )//(还有就是为啥加一个j<k这个条件) {
flag [i*prime[j]] = false ;
if ( i % prime[j] == 0 ) break ; //(特别是这段,为啥判断是这个条件) }
}
}
int main ()
{
int n , k = 0 ;
get_prime(k) ;
return 0 ;
}
还有我对这段代码的总的思路理不清 不知道是以咋样的思路写的
希望有大侠指导一下
------解决方案--------------------
普通的筛法是:
筛素数算法(均摊的Eratosthenes筛 + 常数优化)
不是很懂这段代码 求大虾指导
#include<stdio.h>
#include<string.h>
#define MAX 40
bool flag[MAX] ;
int prime[MAX/2] ;
void get_prime( int &k )
{
memset(flag , true , sizeof (flag) ) ;
int i , j ;
for ( i = 2 ; i < MAX ; i ++ )
{
if ( flag[i] ) prime[k++] = i ;
for ( j = 0 ; j < k && i * prime[j] < MAX ; j ++ )//(还有就是为啥加一个j<k这个条件) {
flag [i*prime[j]] = false ;
if ( i % prime[j] == 0 ) break ; //(特别是这段,为啥判断是这个条件) }
}
}
int main ()
{
int n , k = 0 ;
get_prime(k) ;
return 0 ;
}
还有我对这段代码的总的思路理不清 不知道是以咋样的思路写的
希望有大侠指导一下
------解决方案--------------------
普通的筛法是:
- C/C++ code
memset(flag, true, sizeof(flag)); for (i = 2; i < MAX; i++) { if (!flag[i]) continue; for (j = 2; i * j < MAX; j++) flag[i * j] = false; }