埃拉托色尼筛法

一、引入

质数(素数):只能被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不需要再判断它的倍数)

posted @ 2019-12-25 11:07  小菜将夜  阅读(265)  评论(0)    收藏  举报