埃拉托色尼筛法 求1~n之间的素数
埃拉托色尼筛法介绍:
要得到自然数n以内的全部素数,必须把不大于
的所有素数的倍数剔除,剩下的就是素数。[1]
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去……。
代码实现:
#include
#include
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));
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); //释放空间
}