埃氏筛选法求素数可以减少遍历次数,及在前期的循环中就将存在的合数打上标记,从而提高算法的时间效率。
一、算法实现
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);