整数分解算法java_java – 查找整数的所有分解的算法

这是一种非常低效的方法.它会生成大量重复项,然后在返回之前将其过滤掉.

这个想法是你从n = 1到len(因子)包含因子中选择乘以,然后你重复使用未使用的因子.

import itertools

def mult(fs):

res = 1

for f in fs:

res *= f

return res

def _generate_all_factorizations(factors):

if len(factors) <= 1:

yield factors

return

for factors_in_mult in xrange(1, len(factors)+1):

for which_is in itertools.combinations(range(len(factors)), factors_in_mult):

this_mult = mult(factors[i] for i in which_is)

rest = [factors[i] for i in xrange(len(factors)) if i not in which_is]

for remaining in _generate_all_factorizations(rest):

yield [this_mult] + remaining

我添加了一个函数来删除重复项并返回它们很好地排序:

def generate_all_factorizations(factors):

seen = set()

res = []

for f in _generate_all_factorizations(factors):

f = tuple(sorted(f))

if f in seen:

continue

seen.add(f)

yield f

现在只需将它归结为您的主要因素:

for factorization in generate_all_factorizations([2, 2, 5]):

print factorization

print "----"

for factorization in generate_all_factorizations([2, 3, 5, 7]):

print factorization

结果:

(2, 2, 5)

(2, 10)

(4, 5)

(20,)

----

(2, 3, 5, 7)

(2, 3, 35)

(2, 5, 21)

(2, 7, 15)

(2, 105)

(3, 5, 14)

(3, 7, 10)

(3, 70)

(5, 6, 7)

(5, 42)

(7, 30)

(6, 35)

(10, 21)

(14, 15)

(210,)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值