例如。循环遍历1-99和1-99的所有组合,使其乘法的总和按降序排列。
99 * 99 = 9801
99 * 98 = 9702
98 * 98 = 9604
99 * 97 = 9603
98 * 97 = 9506
99 * 96 = 9504
...
5 * 1 = 5
2 * 2 = 4
4 * 1 = 4
3 * 1 = 3
2 * 1 = 2
1 * 1 = 1
我已经尝试了几天想出一个模式。在这一点上,我认为如果不先进行乘法运算几乎是不可能的。有没有人这样做过?
答案 0 :(得分:0)
这是一种使用O(log n)内存和O(n log n)时间的合并排序样式分而治之的方法。它将产品中第一个数字的范围缩小了一半,然后懒洋洋地合并了懒洋洋地生成产品的结果。我使用了一种技巧,在产生器中使产品为负,这样结果就会以降序而不是升序排列。
import heapq
def inorder(a0, a1):
if a1 - a0 == 1:
return ((-a0*b, a0, b) for b in xrange(a0, 0, -1))
am = (a0 + a1) // 2
return heapq.merge(inorder(a0, am), inorder(am, a1))
for r, a, b in inorder(1, 100):
print a, '*', b, '=', -r
答案 1 :(得分:0)
此问题基本上与Order (a,b) pairs by result of a*b
重复我已经查看了问题的所有答案,并且仍然相信我的是最好的,尽管它不是被接受的那个。 :)
关键是:
a * b = c
使得c目前是您可以获得的最大产品(a - 1) * b
或a * (b - 1)
?(a - 1) * b
和a * (b - 1)
但是如果你需要循环遍历所有组合,到目前为止最简单的解决方案是生成所有产品然后排序。它只有10000个项目,因此使用上述方法获得的任何效率提升都是最小的。