python对整数进行因数分解_python-将int分解为较低的整数

我在30-60范围内有一个随机整数,可以使用randint(30,60)获得.假设它是40.我想将此数字精确地分成7个随机整数.因此,例如[5,5,5,5,5,5,10]是有效的结果.但是还有很多可能的解决方案,例如[6,6,6,6,6,6,4]或[4,2,9,13,8,1,3] …

我知道有很多解决方案,但我正在寻找一种快速的解决方案.我并不是想获得每一个解决方案,而是在寻找一种在短时间内迭代很多解决方案的快速方法.实现该目标的一种方法是随机选择一个数字(假设范围为1-15)并将其保存到列表中,然后进行while循环直到总和恰好为40.我尝试过这样做,但效率不高所有.我认为选择一个起始值,例如[5,5,5,5,5,5,10]并以一种精确的方式更改数字,例如“第一个数字-2”和第3个2即可得出[3,5,7,5 ,, 5,5,10]是一个更快的解决方案.有谁知道该怎么做或有很好的建议?谢谢.我更喜欢python 3.

最佳答案

如果您只想获得一个合计的任意数字集,而不是对所有组合进行详尽的迭代,那么以下内容将为您提供所需的信息.

def get_parts(total, num_parts=7, max_part=15):

running_total = 0

for i in range(num_parts - 1):

remaining_total = total - running_total

upper_limit = min(max_part, remaining_total - num_parts + 1 + i)

# need to make sure there will be enough left

lower_limit = max(1, remaining_total - max_part*(num_parts - i - 1))

part = randint(lower_limit, upper_limit)

running_total += part

yield part

yield total - running_total

>>> list(get_parts(40))

[2, 7, 10, 11, 1, 4, 5]

>>> list(get_parts(40))

[7, 13, 11, 6, 1, 1, 1]

>>> list(get_parts(50, 4))

[6, 14, 15, 15]

当然,上面每个列表中的项目并不是真正随机的,并且会优先使用列表中较大的数字和之后较小的数字.如果您想要更多伪随机元素,则可以通过random.shuffle()提供这些列表.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值