python - 找到每个数字恰好只有一次并且能被 11 整除的最大数(在一个范围内)

标签 python

我的任务是找到 1023456789 和 9876543210 之间的最大数字,它包含 0 到 9 之间的所有数字,并且可以被 11 整除。我写了一些从技术上应该能够找到的代码通过蛮力进行编号(请记住这个 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)))

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

最佳答案

这个问题涉及一个由 0-9 组成的 10 位数字的简单排列,因此可以使用 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

关于python - 找到每个数字恰好只有一次并且能被 11 整除的最大数(在一个范围内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66730594/

相关文章:

python - 从字符串中解析有效的 JSON 对象或数组

python - 如何动态装饰类方法,同时又不失去方法绑定(bind)状态?

python - 减少超出范围的数组

python - 如何在numpy中将矩阵变成对角矩阵?

python - 如何对 python 说 (a+b) = (b+a) 和 (a*b) = (b*a)

python - 询问字典中两个值中的一个

python - 在 PyQt5 中实现 Canvas

python - 从远程读取 h5 文件

python - Django/Apache/mod_wsgi 不使用 virtualenv 的 Python 二进制文件

python - 使用 matplotlib 在另一个轴中嵌入多个插入轴