【问题标题】:Program thats asks for a number then prints out all its factors, 150 --> 2,3,5,5程序要求输入一个数字,然后打印出它的所有因数,150 --> 2,3,5,5
【发布时间】:2018-07-25 01:08:44
【问题描述】:
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))

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

【问题讨论】:

  • 这段代码的副作用也很有趣,输入质数(2 除外)将导致无限循环。仔细检查您的逻辑,并通过一个简单的示例(例如 10)手动逐步完成,看看您的逻辑在哪里出错。
  • 您想要仅质因数还是所有因数?你也想要负面因素吗??
  • 只是乘以这个数字的因素......问题措辞不佳。 150/2 = 75, 75/3 = 25, 25/5 =5, 5/5 = 1

标签: python-3.x


【解决方案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]

【讨论】:

  • 我知道,但我试图在标题中生成 OP 的预期输出,而不是因子的数学定义。
  • 请问//= 是做什么的?这只是基本的划分吗?
  • @Pallof //是整数除法,所以a // b等价于int(a / b)a //= b等价于a = a // b
【解决方案2】:

return 关键字实质上终止了函数的执行。任何紧跟在return 语句之后的语句将永远无法到达。因此,一旦您找到一个因素并执行return i,您的功能就会结束。也许你混淆了return iprint i?或者,将其添加到数组中并通过下一个递归函数调用传递。

【讨论】:

    【解决方案3】:

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

    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)))
    

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

    【讨论】:

    • 我对为什么范围从 1 开始到 n+1 结束有点困惑
    • 它只是查看每个数字并检查它是否平均分配——如前所述,没有考虑效率。如果你愿意,我可以更新一个更有效的答案。
    • 不,不。没必要这么客气。我只是感到困惑,因为我不想从 2 开始,因为无论如何 1 都会是一个因素?
    • 当然,您可以这样做,但除非您手动添加,否则它将被排除在结果之外。
    • 没问题。我添加了更高效的版本——我讨厌到处推广慢速分解功能。让我知道这里是否有任何问题。
    【解决方案4】:

    如果你想要所有的因素,那么你可以这样做:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2017-09-13
      • 2022-11-21
      • 2022-11-12
      • 1970-01-01
      • 2021-09-04
      • 2020-08-11
      相关资源
      最近更新 更多