找出每个数字恰好一次且能被11整除的最大数(在一个范围内)

我的任务是找到 1023456789 和 9876543210 之间的最大数字,其中包含 0 到 9 之间的所有数字恰好一次并且可以除以 11。我写了一些代码,从技术上讲应该能够通过蛮力找到这个数字force(请记住这个 Python 3.6)。代码如下:

print(max(x for x in range(1023456789, 9876543210) if x % 11 == 0 and '0' in str(x) and '1' in str(x) and '2' in str(x) and '3' in str(x) and '4' in str(x) and '5' in str(x) and '6' in str(x) and '7' in str(x) and '8' in str(x) and '9' in str(x)))

如果代码看起来很奇怪,我很抱歉,因为我仍然没有经验。当我用最小值尝试时,我花了大约两个小时才得到结果。在这种情况下,计算机仍在运行 8 个小时。事后看来,这是合乎逻辑的,它必然会发生,所以现在我正在寻找一种替代方法来加速这个过程并尽可能早地得到我的结果。

回答

该问题涉及一个 10 位数字的简单排列,其中之一是0-9,因此可以使用itertools.permutations,使用包含按最高到最低顺序排列的所有这些数字的字符串来生成

鉴于置换算法的性质是输出将“根据输入可迭代的顺序以字典顺序发出”,因此它将保证产生的数字将以正确的递减顺序,从最大的(初始输入)。这将允许简单的解决方案,其中简单地遍历该生成器并将结果字符列表转换为字符串,然后转换为int,然后模数最终会得到所需的输出。

import itertools
  
def solution():
    for raw in itertools.permutations('9876543210'):
        number = int(''.join(raw))
        if number % 11 == 0:
            return number

print(solution())

9876524130在 51 次迭代后打印为解决方案。

为了完整起见,本着原始单行的精神:

>>> next(n for n in (int(''.join(raw)) for raw in itertools.permutations('9876543210')) if n % 11 == 0)
9876524130


以上是找出每个数字恰好一次且能被11整除的最大数(在一个范围内)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>