如何有序地产生天然产物?

时间:2019-05-08 18:19:45

标签: python math mathematical-optimization

您想要一个订购产品n x m的列表,以便nm都是自然数,1 < (n x m) < upper_limit就是uper_limit = 100。同样,n和m都不能大于上限的平方根(因此n <= 10m <= 10)。 最简单的方法是生成具有列表理解的所有产品,然后对结果进行排序。

sorted(n*m for n in range(1,10) for m in range(1,n))

但是,当upper_limit变得很大时,这并不是很有效,特别是如果目标是在给定特定条件下仅找到一个数字(例如,找到最大乘积使得...->我想要以降序生成产品,测试它们并在我发现第一个符合标准的产品时立即停止整个过程。

那么,如何按顺序生成此产品?

我要做的第一件事是从上限开始,一个接一个地回退,进行双重测试:  -检查数字是否可以是n和m的乘积  -检查标准 再次,这不是很有效... 有解决这个问题的算法吗?

2 个答案:

答案 0 :(得分:0)

我找到了一个稍微有效的解决方案。 对于a和b是自然数:

S = a + b
D = abs(a - b)

如果S为常数,则D越小,a * b越大。 因此,对于每个S(以降序排列),都可以随着D的增加而遍历所有可能的元组(a,b)。

首先,我插入外部条件,如果乘积a b符合条件,则迭代通过递减S较小和递增D较小的其他(a,b)元组,以检查是否找到其他遵守该条件的数字条件相同,但a b更大。我重复迭代,直到找到D == 0或1的数字(因为在这种情况下,不能有S较小的元组具有较高的乘积)

答案 1 :(得分:-2)

以下代码将重复检查所有可能的组合,并在满足条件时停止。在此代码中,如果在内部循环中执行break,则也会在外部循环中执行break语句,否则将执行continue语句。

from math import sqrt
n = m = round(sqrt(int(input("Enter upper limit"))))
for i in range(n, 0, -1):
    for j in range(i - 1, 0, -1):
        if * required condition:
            n = i
            m = j
            break
    else:
        continue
    break