Python:素数因子分解大整数除法始终返回不正确的结果
我有一些这样的代码:Python:素数因子分解大整数除法始终返回不正确的结果,python,math,floating-point,division,prime-factoring,Python,Math,Floating Point,Division,Prime Factoring,我有一些这样的代码: def prime_factorisation(num): prime_factorisation_list = [] prime = 2 while prime**2 <= num: if not num % prime: prime_indexes = [item[0] for item in prime_factorisation_list] if prime in prim
def prime_factorisation(num):
prime_factorisation_list = []
prime = 2
while prime**2 <= num:
if not num % prime:
prime_indexes = [item[0] for item in prime_factorisation_list]
if prime in prime_indexes:
position_in_list = prime_indexes.index(prime)
prime_factorisation_list[position_in_list][1] += 1 # Increments count for prime factor
else:
prime_factorisation_list.append([prime, 1]) # Creates count for prime factor in the form [prime, count]
num /= prime
else:
prime += 1
if num > 1:
prime_factorisation_list.append([int(num), 1])
return prime_factorisation_list
number = 2938475648329038472
print(prime_factorisation(number))
def素数分解(num):
素数分解列表=[]
素数=2
而素数**2 1:
素数分解列表。追加([int(num),1])
返回素数分解列表
数字=2938475648329038472
打印(素数分解(数字))
它是一种素因子分解算法,以以下形式返回列表列表:
[[素因子1,发生次数],[素因子2,发生次数],…]
但是,行:num/=prime
似乎给出了错误的结果。
我认为这是浮点除法的问题,因为当我用它代替num//=prime
it时,它返回正确的结果
我知道一个浮点的最大值是309位,但这远小于这个值。我也在做整数除法(将一个数除以它的一个因子),所以小数点应该是零
有人能给我解释一下为什么会发生这种情况吗?它给出了正确的结果,因为//是整数除法,你的目的是找到素数因子
真正的分裂本身是不准确的。看看这个。关于这个问题。浮点数不能存储309位数字。它最多可以存储10**309的值,但只存储前17位有效数字。这就是问题所在。你也可以自己检查:
print(2938475648329038472/2)
->1.4692378241645192e+18
和print(2938475648329038472//2)
->1469237824519236
。在第一种情况下,最后两个值是四舍五入的。哦,我一直认为1.xxx e+yyy表示保存了整个数字,但只显示了一些数字(类似于计算器)。a