请用C语言实现素数筛并给出解释
时间: 2023-05-17 22:04:57 浏览: 84
好的,以下是C语言实现素数筛的代码和解释:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 100; // 筛选范围
int *is_prime = (int *)malloc(sizeof(int) * (n + 1)); // 动态分配数组
for (int i = 2; i <= n; i++) {
is_prime[i] = 1; // 初始化为素数
}
for (int i = 2; i <= n; i++) {
if (is_prime[i]) { // 如果是素数
for (int j = i * i; j <= n; j += i) { // 将其倍数标记为非素数
is_prime[j] = 0;
}
}
}
printf("2 ");
for (int i = 3; i <= n; i += 2) { // 输出素数
if (is_prime[i]) {
printf("%d ", i);
}
}
free(is_prime); // 释放内存
return 0;
}
```
解释:
素数筛是一种用于筛选素数的算法,其基本思想是从小到大枚举每个数,如果它是素数,则将其倍数标记为非素数。具体实现时,可以使用一个布尔数组来记录每个数是否为素数,初始时将所有数都标记为素数,然后从2开始枚举每个数,如果它是素数,则将其倍数标记为非素数。最后再遍历一遍数组,输出所有标记为素数的数即可。
在上面的代码中,我们使用动态分配数组来存储每个数是否为素数,初始时将所有数都标记为素数。然后从2开始枚举每个数,如果它是素数,则将其倍数标记为非素数。最后再遍历一遍数组,输出所有标记为素数的数即可。需要注意的是,由于2是最小的素数,因此我们需要先输出2,然后再从3开始枚举奇数。最后,我们需要释放动态分配的数组内存。
阅读全文