埃氏筛选法求素数可以减少遍历次数,及在前期的循环中就将存在的合数打上标记,从而提高算法的时间效率。
一、算法实现
void  prime_number(int  n)
{
  int  flag[n];
  int  count = 0;
  int* primeArr;
  /// 默认标记所有的数都是素数
  memset(flag,0,sizeof(flag));
  int  i = 2;
  for(; i<n; i++)
  {
     int  j ;
     if(flag[i]==0)
     {
        count++;
        int* temp = (int*) malloc( count*sizeof(int) );
        memcpy(temp,primeArr,(count-1)* sizeof(int));
        free(primeArr);
        primeArr = temp;
        primeArr[count-1] = i;
        /// 通过提前遍历将已知的合数打上标记
        for( j = i*i ; j< n ; j+=i)
        {
          ///将合数标记为1
          flag[j] = 1;
        }
     }
  }
  
   printf("The prime numbers count is %d  in  %d\n",count,n);
   i=0;
   for( ; i<count; i++)
   {
    printf("%d\n",primeArr[i]);
   }
   free(primeArr);
  
} 
二、算法测试
    prime_number(100); 




















