当前位置: 代码迷 >> 综合 >> 求1~n之间的素数(C语言 + 埃拉托色尼筛法 + 详细注释)
  详细解决方案

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

热度:83   发布时间:2024-01-26 16:14:40.0

#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);                                       //释放空间
}