pta中筛选法求素数
时间: 2025-06-30 09:19:56 浏览: 7
### 筛选法求素数的算法实现
筛选法是一种高效的求素数方法,其基本思想是通过逐步淘汰非素数来保留素数。以下是筛选法的具体实现及解释。
#### C语言实现筛选法
在C语言中,可以通过数组来存储2到n之间的所有整数,并逐步将非素数标记为0,最终输出数组中不为0的数作为素数[^2]。
```c
#include <stdio.h>
int main() {
int n = 0;
while (~scanf("%d", &n)) {
int arr[10001] = {0}; // 假设n不超过10000
for (int i = 2; i <= n; i++) {
arr[i] = i; // 初始化数组
}
for (int j = 2; j <= n; j++) {
if (arr[j] != 0) { // 如果当前数未被标记为非素数
for (int k = j + 1; k <= n; k++) {
if (arr[k] % j == 0) { // 将j的倍数标记为非素数
arr[k] = 0;
}
}
}
}
int count = 0;
for (int i = 2; i <= n; i++) {
if (arr[i] != 0) { // 输出素数
printf("%d ", arr[i]);
count++;
}
}
printf("\n素数个数: %d\n", count);
}
return 0;
}
```
#### Python实现筛选法
在Python中,可以使用列表来存储2到n之间的所有整数,并通过类似的方法将非素数从列表中移除或标记为`False`,最终输出剩余的素数[^3]。
```python
def sieve_of_eratosthenes(n):
primes = [True] * (n + 1) # 初始化布尔数组,表示是否为素数
primes[0], primes[1] = False, False # 0和1不是素数
for i in range(2, int(n**0.5) + 1): # 遍历到sqrt(n)
if primes[i]: # 如果i是素数
for j in range(i * i, n + 1, i): # 将i的倍数标记为非素数
primes[j] = False
prime_numbers = [x for x in range(n + 1) if primes[x]] # 收集所有素数
return prime_numbers
# 测试代码
n = int(input("请输入一个大于2的自然数: "))
prime_list = sieve_of_eratosthenes(n)
print(f"2到{n}之间的素数为: {prime_list}")
print(f"素数个数: {len(prime_list)}")
```
#### 算法复杂度分析
筛选法的时间复杂度为O(n log log n),相较于试除法的O(n√n),效率更高,尤其在处理较大范围的素数时表现更优[^2]。
---
###
阅读全文
相关推荐


















