求1~n之间的素数(C语言 + 埃拉托色尼筛法 + 详细注释)

#include<stdio.h>

void checkprime(int n);

int main(){
    int n;
    scanf("%d", &n);
    checkprime(n);

   return 0;
}

void checkprime(int n){                       /*埃拉托色尼筛法*/
    int i, j, cnt;
    int *a = (int *)malloc(sizeof(int) * (n + 1));                  //根据需要申请空间,a[i]为1表示素数,为0表示非素数
    for(i = 0; i < n; i++)
        a[i] = 1;                                 //先将数组a中所有元素全部设成1,即假设全为素数
    cnt = 0;
    for(i = 2; i * i <= n; i++)     /* i 只需要遍历到根号n即可 */
        if(a[i])                           //如果i是素数
            for(j = i; j * i < n; j++)
                a[j * i] = 0;            /* 将其倍数全部删掉 */
    for(i = 2; i <= n; i++)
        if(a[i]){                          //处理完后a[i] = 1则说明i是素数
            cnt++;
            printf("%4d%s", i, cnt % 10 ? " " : "\n");                      //每10个换行
        }
    free(a);                                       //释放空间
}

 

发布了30 篇原创文章 · 获赞 10 · 访问量 408

猜你喜欢

转载自blog.csdn.net/qq_45472866/article/details/104051475