python - 不能将 2 定义为素数
问题描述
我正在尝试定义素数,但我的算法无法识别2
为prime number
. 而是返回None
。我在 中尝试Google Colab
,Jupiter Notebook
结果PyCharm
相同。
我的代码:
# V1) Test all divisors from 2 through n-1. (skip 1 and n)
def is_prime_v1(n):
""" Return 'True' if 'n' is a prime number. False otherwise. """
if n == 1:
return False # 1 is not prime
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
# ===== Test Function =====
for n in range(1, 21):
print(n, is_prime_v1(n))
我的输出:
1 False
2 None
3 True
4 False
5 True
6 False
7 True
8 False
9 True
10 False
11 True
12 False
13 True
14 False
15 True
16 False
17 True
18 False
19 True
20 False
此外,返回有一些错误,比如9
is not a prime number
.
此代码来自,开始于0:46
:Python 和素数 || Python 教程 || 学习 Python 编程
解决方案
因为您的程序永远不会进入循环。
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
从 2 开始,直到n-1
. 此外,您应该以不同的方式缩进。只有在您的程序退出循环后,您才应该return True
:
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
但是如果你想优化你的功能,它应该是这样的:
def is_prime_v1(n):
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for d in range(3, round(n**0.5) + 1, 2):
if n % d == 0:
return False
return True
由于您不需要检查数字本身,因此只有平方根。此外,任何偶数都不能是素数(2 除外),因为它可以被 2 整除。
编辑:
我很高兴我的回答有帮助:)
推荐阅读
- blockchain - 非加密货币区块链中的股权共识证明
- python - YAML格式文件test.yaml中,部分MAC地址会被判断为数字
- javascript - 为什么我使用 jQuery 添加类后单击不起作用?
- android - 如何在不使用 WorkManager 立即运行的情况下更改定期工作请求周期?
- php - 如何在mysql上使用daterange每10分钟显示一次数据
- javascript - 将控制器变量传递给 ASP MVC 中的 JavaScript 文件
- ios - 如何从geoJson附加二维数组?
- python - 附加多个 Counter() 对象并转换为数据框
- java - 如何在移动网络上为 android 设置 dns?
- javascript - Angular 6:从父组件接收数据后,在 ngAfterContentChecked 内连续执行 http 请求