您想获得已订购产品的列表n x m
这样两个n
和 m
是自然数,1 < (n x m) < upper_limit
,说 uper_limit = 100
. n 和 m 也不能大于上限的平方根(因此 n <= 10
和 m <= 10
)。
最直接的做法是使用列表理解生成所有产品,然后对结果进行排序。
sorted(n*m for n in range(1,10) for m in range(1,n))
但是当upper_limit
变得非常大那么这不是很有效,特别是如果目标是在给定特定条件下只找到一个数字(例如找到最大产品...... ->我想按降序生成产品,测试它们并在我找到第一个符合标准的人后立即停止整个过程)。
那么,如何按顺序生成这些产品呢?
我做的第一件事是从 upper_limit 开始,一个一个地往回走,做一个双重测试: - 检查数字是否可以是 n 和 m 的乘积 - 检查标准 同样,这不是很有效...... 有解决这个问题的算法吗?
最佳答案
我找到了一个稍微更有效的解决这个问题的方法。 对于 a 和 b 是自然数:
S = a + b
D = abs(a - b)
如果S一定,D越小,a*b越大。 因此,对于每个 S(按降序排列),可以使用递增的 D 遍历所有可能的元组 (a, b)。
首先,我插入外部条件,如果乘积 ab 符合条件,那么我将遍历其他具有较小递减 S 和较小递增 D 的 (a,b) 元组,以检查我是否找到符合该条件的其他数字相同的条件,但有更大的 ab。我重复迭代,直到找到 D == 0 或 1 的数字(因为在这种情况下,不可能有 S 较小但乘积较高的元组)
关于python - 如何按顺序生成天然产物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56046873/