给定一个整数,获取其所有因数对的最简单方法是什么?

4

如何最简单地获取给定整数的所有因子对列表?

例如:f(20)将返回[(1,20), (2,10), (4,5)]


1
部分重叠,但问题不同。 - Christopher O'Donnell
3个回答

12
def f(value):
    factors = []
    for i in range(1, int(value**0.5)+1):
        if value % i == 0:
            factors.append((i, value / i))
    return factors

或者使用列表推导式实现相同的功能:

def f(val):
    return [(i, val / i) for i in range(1, int(val**0.5)+1) if val % i == 0]

我添加了硬编码因子1来微调函数(因为做% 1几乎没有意义)-但人们对此有何看法?代码的混乱和无法接受小于1的值是否超过了极小的优化? - Steve Mayne
这有点棘手,因为它将1作为0的因子返回,这是“不正确”的。可以通过执行result = [(1, value)] * (value > 0)来解决这个问题,这可能仍然比执行额外的迭代更快。 - Benjamin

3
或者是这样的:
def f(n):
        factors_list = []
        for i in xrange(1, int(n**0.5) + 1):
            if n % i == 0:
                factors_list.append((i, n/i))
        return factors_list

print f(20)

编辑:或者使用列表推导式的一行代码:

def f(n):
    return [(i, n / i) for i in xrange(1, int(n**0.5) + 1) if n % i == 0]

print f(36)

编辑2:如果您希望该函数适用于负整数(以及0和正整数),请使用以下代码:
def f(n):
    return [(i, n / i) for i in xrange(1, int(math.sqrt(math.fabs(n))) + 1) if n % i == 0]

print f(-36)

@odonnell: 当处理大量数字时,可以使用xrange来提高速度(但在Python 3中不需要),使用ceil可以增加代码的清晰度和简洁性。 - Benjamin
“ceil” 不会从 factor_list 中移除整数平方根,你需要将其加 1。 - TheDude
@Brendan:你有例子吗? - Benjamin
1
我喜欢你的一行代码,不需要显式地创建一个空列表很好。 - Christopher O'Donnell
@Benjamin:如果n = 16,则范围将给我们1->4,因为'math.ceil(16**0.6) = 4'。由于xrange和range在迭代时排除结束值,因此我们无法在factors_list中拥有(4,4)。 - TheDude
@Brendan:非常正确。我会改回 int(n**0.5) + 1。 - Benjamin

0
这样怎么样:
def f(n):
    from itertools import takewhile
    if not isinstance(n,int):
          raise ValueError("supplied %s type, requires integer input" %(type(n).__name__))
    return [(i,n/i) for i in takewhile(lambda x:x*x<n,xrange(1,n)) if (n%i)==0]

你为什么要使用(n/i)*i==n,而不是使用取模运算符(%)呢? - Steve Mayne
@Benjamin:如果你正在使用Python 2.x,请尝试在Python控制台中键入(5/2)*2 == 5 - JoshAdel
1
检查类型是愚蠢的,但如果你必须这样做,不要只打印一条消息并试图混淆。引发一个 TypeError。但是说真的,不要检查参数类型。 - Winston Ewert
1
我认为你的列表推导式是反向的。我也认为承认看到一个好答案比将其编辑成自己的更酷。 - Benjamin
@highBandWidth:我的意思是你现在的回答和你原来的回答完全不同了。 - Benjamin
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接