您想要一个订购产品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
变得很大时,这并不是很有效,特别是如果目标是在给定特定条件下仅找到一个数字(例如,找到最大乘积使得...->我想要以降序生成产品,测试它们并在我发现第一个符合标准的产品时立即停止整个过程。
那么,如何按顺序生成此产品?
我要做的第一件事是从上限开始,一个接一个地回退,进行双重测试: -检查数字是否可以是n和m的乘积 -检查标准 再次,这不是很有效... 有解决这个问题的算法吗?
答案 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