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 ; 
 }

还有我对这段代码的总的思路理不清 不知道是以咋样的思路写的
希望有大侠指导一下

------解决方案--------------------
普通的筛法是:
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;
}