埃拉托色尼筛法
一、引入
质数(素数):只能被1和本身整除的数,0和1既不是质数也不是合数
实际上是求素数的一种算法
二、代码
#include <stdio.h> #define N 100 void main(){ int i,array[N],j; //0和1既不是质数也不是合数 array[0]=0; array[1]=0; for(i=2;i<N;i++) array[i]=1; //遍历2~100,把每个数的倍数都去掉(标记为0) for(i=2;i<N;i++){
//如果已经被判断为合数就不用再用此数倍数判断了 if(array[i]){ for(j=i;j*i<=N;j++){ array[j*i]=0; } } } for(int i=0;i<N;i++) { if(array[i]==1){ printf("%d ",i); } } }
结果:

分析:如果一个数是质数,那么他的因数一定只有1和本身。所以依次把1-100,每个数的倍数简称m(m由于是倍数,所以因子至少都有三个,1,本身和倍数;例如质素2乘以3=6,6不是质数,因为6的因子至少有1,6,还有3)都去掉,那么剩下来的一定是质数
注: if(array[i]) ,该句是如果一个数已经被判断为合数,那么就不需要再去掉它的倍数了(设想一个数(y)已经被判断为合数,那么他一定是在之前的时候,某个数(x)乘以倍数的时候被去掉的,那么y=x*倍数。那么y的倍数:y*倍数=(x*倍数)*倍数,可以明显看出来其实y的倍数就在前面x的倍数中,也就是说前面已经都判断过了,所以y不需要再判断它的倍数)

浙公网安备 33010602011771号