素数筛选:
所谓的素数筛选其实依据一个bool型数组来实现筛选。将数组下标为奇数的等于true,偶数为false.
然后:
for( i=3; i<=sqrt(n); i+=2 )
{ if(prime[i])
for( j=i+i; j<=n; j+=i ) prime[j]=false;
}
最后输出下标为true的数就好了;
原理:质数的倍数必然是合数,如果这个数已经不是质数了,则找他后面的质数将其筛掉。
下面举个例子:筛选30以内的素数。
1. 将 4 6.....28 30定义为false.(实际就是先排除2的倍数)
2. i=3; 由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false.
i=4; 由于prime[4]=false,不在继续筛法步骤。
i=5; 由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false.
i=6>sqrt(30)算法结束。
3 。 把prime[]值为true的下标输出来:
for(i=2; i<=30; i++)
if(prime[i]) printf("%d ",i);
结果是 2 3 5 7 11 13 17 19 23 29
下面附上代码:
#include<stdio.h> #include<math.h> #define N 30 bool prime[N]; int main() { int i, j; prime[2]=true; for(i=3; i<N; i++) if(i%2==0) prime[i]=false; else prime[i]=true; for(i=3; i<=sqrt(N); i++) { if(prime[i]) for(j=i+i; j<N; j+=i) prime[j]=false; } for(i=2; i<30; i++) if( prime[i] )printf("%d ",i); return 0; }
转载的。。。希望像我这样的初学者能够好好理解理解。。。。。