Python 为什么每个数字都是素数?
这是我的密码:Python 为什么每个数字都是素数?,python,primes,Python,Primes,这是我的密码: from time import sleep n = 5 k = 2 found_factors = 0 while True: kinn = n/k if (n == k) and found_factors == 0: print("Found prime:", n) n += 1 k = 2 found_factors = 0 sleep(0.1) conti
from time import sleep
n = 5
k = 2
found_factors = 0
while True:
kinn = n/k
if (n == k) and found_factors == 0:
print("Found prime:", n)
n += 1
k = 2
found_factors = 0
sleep(0.1)
continue
elif (n == k) and found_factors > 0:
n += 1
k = 2
found_factors = 0
continue
if isinstance(kinn, int) == True:
found_factors += 1
k += 1
这个程序的目的是从5开始寻找素数。但出于某种原因,它将每个数字作为素数输出
为什么会发生这种情况?
n/k
总是返回一个浮点,即使k
除以n
,因此,例如6/2
是3.0
,它是一个float
,并且不是int
的实例,但是,还有另一种方法可以检查数字是否是整数,在n
和k
之间使用模运算符%
,得到除法的剩余部分:
from time import sleep
n = 5.0 # change one of n/k to float so division will not truncate
k = 2
found_factors = 0
while True:
kinn = n/k # note: in python 2 dividing ints truncates the remainder
if (n == k) and found_factors == 0:
print("Found prime:", n)
n += 1
k = 2
found_factors = 0
sleep(0.1)
continue
elif (n == k) and found_factors > 0:
n += 1
k = 2
found_factors = 0
continue
# kinn used to truncate to an int, which is why this statement was always hit.
# By changing the type of n to float, we test for remainder of n/k instead
if n % k == 0:
found_factors += 1
k += 1
if n % k == 0:
found_factors += 1
通过在程序中替换它,它将输出:
Found prime: 5
Found prime: 7
Found prime: 11
Found prime: 13
Found prime: 17
Found prime: 19
Found prime: 23
Found prime: 29
Found prime: 31
Found prime: 37
Found prime: 41
Found prime: 43
Found prime: 47
Found prime: 53
Found prime: 59
Found prime: 61
Found prime: 67
# ........ more
Python 2还是3
5/2
不做您认为它在python 2中所做的事情isinstance(kinn,int)
不测试您认为它测试的东西。如果你想要一个整除性测试,那就是如果n%k==0
,测试余数。如果你使用的是Python 3,你可能想要5//2
,你有没有尝试过在调试模式下单步检查你的代码来找出问题所在?没有,float通常不是这样工作的。对于小整数,这可能有效,但对于大整数,则不行。因此,您的答案是w.l.o.g.错误。@MarcusMüller您是对的,我现在更新了我的答案,我使用的是。is_integer()
@pagie_u。您应该使用。is_integer()
,它更安全。@pagie_u。不,它不起作用,或者只适用于小数字。同样,浮动不是这样工作的。例如,以(float(2**112)+0.5)为例。虽然2**112+0.5肯定不是整数,但is_integer()==True
。尝试确定两个整数的比率是否为整数只是为了确定一个整数是否除以另一个整数有点奇怪,因为python对整数有一个模运算符。。。