Py学习  »  Python

如何解决Python中大数问题的函数?

Simurg1866 • 3 年前 • 1208 次点击  

我想找出600851475143的因素。我的代码坏了。

def factor(a):
factor = []
for i in range (1, a+1):
    if(a%i==0):
        factor.append(i)

print(factor)
factor.clear()

系数(600851475143)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132393
 
1208 次点击  
文章 [ 4 ]  |  最新文章 3 年前
Alain T.
Reply   •   1 楼
Alain T.    3 年前

函数应该返回因子列表(而不是打印)。因为你要计算从1到1的所有潜在因子 a ,需要很长时间才能产生一个非常大的结果,比如600851475143。

为了加快运算速度,您可以成对提取因子,这样您只需查看整数平方根以下的除数。每次你找到数字(N)的一个因子(f),你就知道有一个对应的因子,它是N除以f(N/f)的结果。这意味着每个因素<=N有一个对应的>=N所以你可以让它们成对出现,只检查除数<=N

def factors(N):
    return [f for d in range(1,int(N**0.5)+1) if N%d==0 for f in {d,N//d}]

输出:

print(factor(600851475143))
[1, 600851475143, 8462696833, 71, 716151937, 839, 408464633, 1471, 
 6857, 87625999, 59569, 10086647, 104441, 5753023, 1234169, 486847]
user17083192 user17083192
Reply   •   2 楼
user17083192 user17083192    3 年前

首先,压痕不正确。必须正确缩进函数的内部代码。它应该包含在定义语句中。接下来,您要在函数外部打印因子列表,它是一个局部变量,而不是全局变量。如果要打印,请在函数中添加一条打印语句,然后调用函数。您更正的代码:

def factor(a):
    factor_1= []
    for i in range (1, a+1):
        if(a%i==0):
            factor_1.append(i)
    print(factor_1)

factor(600851475143)

另外,不要保持函数名和列表名相同。这可能会出错

riquefr
Reply   •   3 楼
riquefr    3 年前

您的代码有一些问题,首先,python中的if语句没有使用 () ,应该只是 if a%i == 0: .您的代码缩进不正确,函数下面的代码不是它的一部分。您创建了一个与函数名同名的全局变量,它们会相互覆盖。
如果要完成此功能,请执行以下操作:

factorlist = []
  
  
def factor(a):
    for i in range(1, a + 1):
        if a % i == 0:
            factorlist.append(i)
  
  
factor(input("Fators of: "))
print(factorlist)
factorlist.clear()

如果要返回结束列表,请使用@Ratery的代码。

Ratery
Reply   •   4 楼
Ratery    3 年前

你可以用 return 关键字返回一个因素列表。

def factor(a):
    factor = []
    for i in range (1, a + 1):
        if a % i == 0:
            factor.append(i)
    return factor

print(factor(int(input())))