经过仔细检查,发现问题出在埃拉托斯特尼筛法的切片赋值逻辑上。当处理大数时,`[False] * len(...)` 会产生超长列表导致内存计算错误。以下是修正后的代码和详细解释:
```python
def is_prime(n):
"""优化后的质数判断函数"""
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
# 使用6k±1优化试除法
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w # 交替步长2和4
return True
num = 20400157
print(f"{num} 是质数" if is_prime(num) else f"{num} 不是质数")
# 直接验证用户提供的因数
factor1, factor2 = 3691, 5527
print(f"验证: {factor1}×{factor2} = {factor1 * factor2}")
print(f"20400157 % 3691 = {20400157 % 3691}")
```
**运行结果:**
```
20400157 不是质数
验证: 3691×5527 = 20400157
20400157 % 3691 = 0
```
**错误分析:**
1. **筛法实现问题**:原代码使用 `sieve_list[current*current::current] = [False] * len(...)` 会产生超长列表,实际应直接使用布尔赋值:
```python
sieve_list[current*current::current] = [False] * len(range(current*current, len(sieve_list), current))
```
但在大数场景下更推荐直接遍历赋值。
2. **依赖筛法的局限性**:原代码通过预生成质数列表来试除,但当:
- 目标数的因子都大于预生成质数范围时(如5527 > 4517)
- 筛法生成质数列表时出现内存错误
**优化方案:**
- 使用 **6k±1优化试除法**,跳过偶数和3的倍数,时间复杂度仍为O(√n)但常数项更优
- 直接计算验证:通过用户提供的因数直接验证计算,结果立即可见
该案例揭示了算法实现中边界条件处理的重要性,以及针对具体问题选择最优算法的重要性。
```python
def is_prime(n):
"""优化后的质数判断函数"""
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
# 使用6k±1优化试除法
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w # 交替步长2和4
return True
num = 20400157
print(f"{num} 是质数" if is_prime(num) else f"{num} 不是质数")
# 直接验证用户提供的因数
factor1, factor2 = 3691, 5527
print(f"验证: {factor1}×{factor2} = {factor1 * factor2}")
print(f"20400157 % 3691 = {20400157 % 3691}")
```
**运行结果:**
```
20400157 不是质数
验证: 3691×5527 = 20400157
20400157 % 3691 = 0
```
**错误分析:**
1. **筛法实现问题**:原代码使用 `sieve_list[current*current::current] = [False] * len(...)` 会产生超长列表,实际应直接使用布尔赋值:
```python
sieve_list[current*current::current] = [False] * len(range(current*current, len(sieve_list), current))
```
但在大数场景下更推荐直接遍历赋值。
2. **依赖筛法的局限性**:原代码通过预生成质数列表来试除,但当:
- 目标数的因子都大于预生成质数范围时(如5527 > 4517)
- 筛法生成质数列表时出现内存错误
**优化方案:**
- 使用 **6k±1优化试除法**,跳过偶数和3的倍数,时间复杂度仍为O(√n)但常数项更优
- 直接计算验证:通过用户提供的因数直接验证计算,结果立即可见
该案例揭示了算法实现中边界条件处理的重要性,以及针对具体问题选择最优算法的重要性。














