要求输入数字的程序,然后打印出所有因素,150-> 2,3,5,5

时间:2018-07-25 01:08:45

标签: python-3.x

n = int(input("What number do you want factored out"))

def factors(n):
    for i in range(2,n):
        if n % i == 0:
            return i
            n = n/i
    return factors(n)

print(factors(n))

我当前正在使用当前代码,但是我只能得到第一个因素。我可以不使用递归来重复代码并生成所有因素吗? 有没有更好的方法来解决这个问题?

4 个答案:

答案 0 :(得分:1)

改为使用while循环:

def factors(n):
    f = []
    while n != 1:
        for i in range(2, n + 1):
            if n % i == 0:
                f.append(i)
                n //= i
                break
    return f
print(factors(150))

或者,具有递归:

def factors(n):
    if n == 1:
        return []
    for i in range(2, n + 1):
        if n % i == 0:
            return [i] + factors(n // i)
print(factors(150))

两个输出:

[2, 3, 5, 5]

答案 1 :(得分:0)

return关键字实质上终止了函数的执行。紧接return语句之后的任何语句都不会到达。因此,只要找到一个因素并执行return i,您的函数就会结束。也许您会混淆return iprint i?另外,也可以将其添加到数组中,然后再传递给下一个递归函数调用。

答案 2 :(得分:0)

这可以递归完成,但是最好迭代地执行此算法,因为它更快,更易读:

def factors(n):
    for i in range(1, int(n ** 0.5) + 1):
        if n % i == 0:
            yield i
            yield n // i

print(list(factors(25)))

这远没有工业实力,但应该相当快。它允许重复,因此您可能希望在set()之前调用list()。您只需要迭代到n的平方根,并且对于任何作为因数的数字i,请包含可以乘以i的数字即可得到n也是

答案 3 :(得分:0)

如果您需要所有因素,则可以执行以下操作:

import numpy as np
fact = lambda x : np.arange(1,x+1)[x % np.arange(1,x+1)==0]

fact(100)
 array([  1,   2,   4,   5,  10,  20,  25,  50, 100])

fact(27)
 array([ 1,  3,  9, 27])

如果您只想要素数乘数:

def facts(x,m=None,i=2):
    if m is None:
        m = []
    if x //i >0:
        if x % i ==0:
            m.append(i)
            facts(x // i,m ,i)
        else:
            facts(x,m,i+1)
    return(m)    

facts(150)
  [2, 3, 5, 5]

facts(2*3*5*7*9*10)
  [2, 2, 3, 3, 3, 5, 5, 7]