生成所有独特的写作方式x = abc?

时间:2013-03-10 04:14:24

标签: c++ python algorithm numbers primes

我有一个数字x,我想找到所有写一个* b * c的独特方法。唯一的意思是2 * 3 * 5与3 * 2 * 5或5 * 3 * 2相同。

我有一个工作算法,它采用x的素数因子分解,然后将因子分成三个区,但是它很慢而且很粗暴,我不得不在以后删除重复项,所以我很好奇是否有更快的方法来直接生成独特的组合。

考虑数字720。

[3, 5, 48]
[5, 9, 16]
[3, 15, 16]
[3, 3, 80]
[2, 5, 72]
[5, 6, 24]
[5, 8, 18]
[2, 15, 24]
[2, 3, 120]
[3, 10, 24]
[6, 8, 15]
[3, 8, 30]
[3, 6, 40]
[2, 8, 45]
[2, 9, 40]
[8, 9, 10]
[4, 5, 36]
[5, 12, 12]
[4, 12, 15]
[3, 4, 60]
[3, 12, 20]
[4, 4, 45]
[4, 9, 20]
[2, 2, 180]
[2, 10, 36]
[2, 12, 30]
[2, 6, 60]
[6, 10, 12]
[2, 4, 90]
[2, 18, 20]
[4, 10, 18]
[4, 6, 30]
[6, 6, 20]

1 个答案:

答案 0 :(得分:1)

在Python中:

def trifactorgenerator(n):
  return (((i,j,n/(i*j)) 
           for i in range(1, int(n**.5)+1) if n%i==0 
             for j in range(i, int( (n/i)**.5)+1) if n%(i*j) == 0))

此功能具有有趣的效果:

  • 这是一个真正的生成器 - 除非调用者创建这样的列表,否则整个列表永远不会在内存中
  • 对每个元组进行排序(例如,(2,3,4)从不(2,4,3)
  • 不返回重复项
  • 元组以字典顺序返回。

参考:https://stackoverflow.com/a/6800214/8747