Python没有像我预期的那样增加循环

时间:2018-07-20 18:30:11

标签: python

我有一些代码,它将一个整数作为输入并打印出该整数素数的排序列表。

它几乎适用于几乎所有数字,例如,当输入为100时,它将打印[2、2、5、5];对于1235632,它将吐出[2、2、3、3、343237]。

但是,对于更大的数字,它不会按顺序打印出因素,我不确定这是否是我忽略的代码中未解决的问题,还是其他原因。

例如,当我放入123456789101112131415161717时,它将输出[3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, [2、2、2、2、2、2、2、2、2、3、3、43、109、104281、1394027],这显然没有排序,我一生也无法找出原因。

我正在使用我认为是pycharm的最新版本。

无论如何,这是代码:

from math import floor
from math import sqrt

n = int(input("Enter a number to be split into its prime factors"))
FList = []
k = 1

while n != 1:
    k = k + 1
    s = floor(sqrt(n))

    if k > s:
        FList.append(int(n))
        break

    if n % k == 0:
        n = n/k
        FList.append(k)
        k = 1

print(FList)

编辑:为了澄清,我宁愿修复程序,因为它是使用排序算法来帮助清理的。

正如其他人指出的那样,大量数字的因素是完全垃圾,所以我想现在的问题是为什么它要打印这些数字。

2 个答案:

答案 0 :(得分:1)

问题是您使用/进行除法,其结果是浮点数:

6/2
# 3.0

当您尝试分解大数时,除以第一个因子(3)后得到的结果是:

1234567891011121314151617 / 3
# 4.115226303370404e+23

是四舍五入的,因为浮点数的精度有限。这就是为什么您现在可以将其除以2多次的原因。

您应该使用整数除法//,它将为您提供无穷精度的精确商:

1234567891011121314151617 // 3
# 411522630337040438050539

因此,只需将代码更改为:

from math import floor
from math import sqrt

n = int(input("Enter a number to be split into its prime factors"))
FList = []
k = 1

while n != 1:
    k = k + 1
    s = floor(sqrt(n))

    if k > s:
        print('appending', n)
        FList.append(int(n))
        break

    if n % k == 0:
        n = n//k  # Use integer division here
        FList.append(k)
        k -= 1  # Try k again on next loop, no need to test smaller values again.

print(FList)

对于您尝试的数字,有一些较大的因素,因此可能需要很多时间...(实际上是3 * 2 * 47 * 4993 * 584538396786764503 ...)

答案 1 :(得分:0)

您可以使用sorted按顺序打印列表。

print(sorted(FList))