我有一些代码,它将一个整数作为输入并打印出该整数素数的排序列表。
它几乎适用于几乎所有数字,例如,当输入为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)
编辑:为了澄清,我宁愿修复程序,因为它是使用排序算法来帮助清理的。
正如其他人指出的那样,大量数字的因素是完全垃圾,所以我想现在的问题是为什么它要打印这些数字。
答案 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))