【问题标题】:Why is every number prime?为什么每个数都是素数?
【发布时间】:2017-09-26 18:45:41
【问题描述】:

这是我的代码:

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 开始的素数。但由于某种原因,它将每个数字都输出为素数!

为什么会这样?

【问题讨论】:

  • Python 2 还是 3? 5 / 2 没有做你认为它在 python 2 中所做的事情
  • isinstance(kinn, int) 不会测试您认为它测试的内容。如果你想要一个可分性测试,那就是if n % k == 0,测试余数。
  • 如果你使用 Python 3,你可能想要5 // 2
  • 您是否尝试过在调试模式下单步执行代码以找出问题所在?

标签: python primes


【解决方案1】:

n/k 总是返回一个浮点数,即使k 除以n,例如6/23.0,这是一个float,但不是int 的实例,还有另一种检查数字是否为整数的方法,使用 nk 之间的模运算符 % 来获得除法的余数:

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

【讨论】:

  • 不,float 通常不会这样工作。对于小整数,这可能有效,但对于大整数,它不会。因此,您的答案是 w.l.o.g.错了。
  • @MarcusMüller 你说得对,我现在更新了我的答案,我正在使用.is_integer()
  • @pagie_ 你应该使用.is_integer(),这样更安全。
  • @pagie_ 不,它不起作用,或者仅适用于少量。同样,这不是花车的工作方式。比如(float(2**112)+0.5).is_integer()==True,虽然2**112+0.5肯定不是整数。
  • 试图确定两个整数的比率是否是一个整数,只是为了确定一个是否除另一个是有点奇怪,考虑到python有一个用于整数的模运算符......
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多