【发布时间】:2013-03-10 08:52:31
【问题描述】:
问题:
给定一个数字 n,是否有一种有效的算法可以从集合 {1...n} 中获取 2 个组合的列表,按组合乘积的值排序?
我需要这个来确定满足特定条件的两个 * 位数字的最大乘积。如果列表是未排序的,我必须首先确定所有满足条件的组合,然后遍历这些组合以找到具有最大产品的组合,这是低效的。
例如,给定 n = 3,可能的组合是:
Combination: Product:
3, 3 9
3, 2 6
3, 1 3
2, 2 4
2, 1 2
1, 1 1
按产品的价值降序排列,这是:
Combination: Product:
3, 3 9
2, 3 6
2, 2 4
1, 3 3
1, 2 2
1, 1 1
额外背景:
我刚刚解决了一个 Project Euler 问题,该问题涉及找到两个 3 位数字乘积的最大回文数。我的方法是从 999(最大的 3 位数字)用两个因素向下迭代,并找到每个组合的乘积,另外检查该数字是否是回文:
def maxpal():
for i in reversed(range(100,1000)):
# Since we only want unique combinations, we only
# need to iterate up to i
for j in reversed(range(100,i)):
if str(i*j) == str(i*j)[::-1]:
yield i*j
print max(maxpal())
请注意,示例中的第一个列表以与此代码完全相同的顺序迭代因子。我最初的假设是,由于我向下迭代,我发现的第一个回文将是最大的。显然情况并非如此,因为j 在递减i 之前一直迭代到100。
我正在寻找一种迭代方法,使产生的值按降序排列,因为这使我只需调用一次next(maxpal) 就可以得到答案,这样效率更高。
编辑:
为了不取消使用非 Python 语言的好答案的资格,我可以尝试使用任何语言,只要您解释它以便我(或其他任何人)能够充分理解它。
【问题讨论】:
-
具体是哪个问题?
-
@johnthexiii Q4 我想。那是几天前的事,但我才起床到 11 点,所以是在那之前。
-
如果这是第四季度,那么有一个更简单的方法来解决它。两个 k 位数字的乘积正好有 2×k 位。您只需要生成 2×k 位回文(并对它们进行一些过滤)。回文数很少,如果使用回文的区分特性,很容易确定。
-
@larsmans 这是我采取的第一种方法。我按降序生成了所有可能的回文,但随后意识到找到 n 位因子的成本非常高(首先找到素因子,然后找到给出 n 位因子的乘法组合)。魔鬼在
(and do some filtering on them) -
@Asad 现在翻译成 Python 为时已晚,所以 Haskell 实现可以接受吗?
标签: python algorithm iteration