Python 得到给定数的因子乘积的组合

Python 得到给定数的因子乘积的组合,python,algorithm,numbers,Python,Algorithm,Numbers,我不确定这个问题之前是否发布过,在搜索之后,我找不到它 问题:请给出一个数字,以打印全要素产品 例如: 给定编号:20 Output: 1 * 20 2 * 10 2 * 2 * 5 4 * 5 给定编号:30 Output: 1 * 30 2 * 15 2 * 3 * 5 3 * 10 5 * 6 以下是我的想法: 解决方案1。 步骤1)首先,得到这个数的所有素数因子 de

我不确定这个问题之前是否发布过,在搜索之后,我找不到它


问题:请给出一个数字,以打印全要素产品

例如:

给定编号:20

Output: 1 * 20
        2 * 10
        2 * 2 * 5
        4 * 5
给定编号:30

Output: 1 * 30
        2 * 15
        2 * 3 * 5
        3 * 10
        5 * 6

以下是我的想法:

解决方案1。
  • 步骤1)首先,得到这个数的所有素数因子

    def get_prime_factors(n):
        factors = []
        if n == 0:
            return factors
    
        # Get the number of 2s that divide n
        while n%2 == 0:
            factors.append(2)
            n /= 2
    
        # n must be odd
        for i in range(3, int(ceil(sqrt(n))), 2):
            while n%i == 0:
                factors.append(i)
                n /= i
    
        # handle the case n is prime number greater than 2s
        if n > 2:
            factors.append(n)
    
        return factors
    
  • 步骤2)然后得到这些因素的组合

我计划通过组合获得全因子产品,但是,我陷入了如何处理这种情况下的重复因子?(问题1)

解决方案2: 通过回溯法求解

def get_factors_recv(n, cur_ret, ret):
    for i in range(2, int(ceil(sqrt(n)))):
        if n%i == 0:
            fact_arr = [i, n/i]
            # add the current value to current result
            cur_ret.extend(fact_arr)
            if sorted(cur_ret) not in ret:
                ret.append(sorted(cur_ret))
                # backtracking
                cur_ret = cur_ret[:-2]
                get_factors_recv(n/i, cur_ret + [i], ret)


def get_all_factors_product(n):
    if n == 0:
        return '';

    result = []
    # push the simple factor multiplier
    result.append([1, n])

    get_factors_recv(n, [], result)

    return result
  • 我想知道上述代码是否有任何优化?(问题2)
  • 有没有更好的解决办法?(问题3)

    • 一个简单的while循环可以解决您的第一个重复问题。给定一个数字:

      num_list = []
      i = 2;
      num = 72*5*5*19*10
      
      while i &lt=num:
          if(num%i == 0):
              num_list.append(i)
              num = num/i
          else:
              i = i + 1
      
      
      print num_list
      
      num_列表将包含这些因素。这样做的目的是在数字不再被它整除之前,不增加索引变量。而且,每次除法后,循环的次数会不断减少,因此循环实际运行的迭代次数会比实际次数少得多。而不是

      while i&lt=num
      
      你也可以使用

      while i&lt=num/2
      
      这在数学上是正确的,并导致迭代次数进一步减少

      这将为您提供所有因素。

      希望这有帮助

      number = 30
      factors = []
      for i in range(1, number+1):
        if number%i == 0:
           factors.append(i)
      
      print factors
      

      有效地分解因子是一个困难的数学问题。但是如果你只对小数字感兴趣,那么你的算法的效率就没有多大关系了。目前最大的努力就是这样。下面是如何生成素数列表的一个变体(中等效率)。结果不符合我的问题。