【问题标题】:How can I make my code loop back to the beginning when I call the function multi()?当我调用函数 multi() 时,如何让我的代码循环回到开头?
【发布时间】:2020-12-22 20:13:50
【问题描述】:

回文数的两种读法相同。由两个 2 位数字的乘积构成的最大回文数是 9009 = 91 × 99。

找出两个 3 位数字乘积的最大回文数。

a = 999
c = 999

def multi():
    global a
    a = a - 1
    global c
    c = 999

for i in range(99, 1000):
    n = a * c
    c -= 1
    print('%s * %s = %s.' % (a, c, n))
    if str(n)[0] == str(n)[-1] and str(n)[1] == str(n)[-2] and str(n)[2] == str(n)[-3]:
        print('%s * %s = %s, which is a palindrome!' % (a, c, n))
    if c == 99:
        multi()
print('Done.')

这是迄今为止我为项目 euler #4 编写的代码。在调用函数 multi() 后,我无法让它回到开头。我还是这整件事的新手,所以如果有什么问题,请忘记我。代码似乎工作,只是没有按预期工作。这是输出的最后几行:

999 * 102 = 102897. 999 * 101 = 101898. 999 * 100 = 100899. 999 * 99 = 99900. 998 * 998 = 997002. 完成。

提前谢谢!

【问题讨论】:

  • for 循环是否在 multi 内?还是multi 只有那 4 行?
  • 我会选择不同的设计。嵌套的 for 循环会更有意义。 for a in range(100, 1000): for c in range(100, 1000): n = a * c(但分成多行)。
  • for 循环不在函数 multi() 内,两者的缩进均为 0。这是一个聪明的方法,我现在可以试试看效果如何哈哈。这个问题快把我逼疯了
  • 另外,要检查字符串是否是回文,使用另一个循环会更有意义。类似str_n = str(n); for i in range(len(str_n)): if str_n[i] != str_n[0 - i]: (Not a palindrome)
  • 或者,非常惯用但更复杂的all(f == l for f, l in zip(str_n, reversed(str_n)))

标签: python-3.x palindrome


【解决方案1】:

这样的事情可能会有所帮助:(正如@Carcigenicate 建议的那样)

n = 0

# this is for 3-digit

for a in range(999, 900, -1):
    for b in range(a, 900, -1):
        x = a * b
        if x > n:
            sab = str(a*b)
            if sab == sab[::-1]:
                n = a * b
                #print(n)

print(n)   # 906609 == 993 * 913

【讨论】:

  • 我知道 [:-1] 是什么意思,但以前从未见过它像 [::-1] 那样使用。得找这个了哈哈无论如何,您提供的使用嵌套 for 循环的答案是天才,而且效果很好。该程序花了大约 2 分钟来运行这么多的数字,但之后立即打印了正确的答案,非常感谢!我不能在这里发布新代码,因为它超过了最大字符数,但很高兴看到它工作。
  • @fmagesty [::-1] 反转序列(切片中的第三个元素是步,负步是倒退)。但请注意,如果可能,应避免使用 [::-1]。它会创建列表的完整副本,这需要对其进行迭代,然后== 可能需要进行另一次完整迭代。对性能不敏感的代码很好,但相对昂贵。
  • @fmagesty - 尝试运行这个小程序 100 次,总时间为 0.7 秒。不知道你的为什么是 2 分钟?您是否仍然只是尝试找到“最大回文数”或之后更改某些内容?请澄清
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2021-08-29
  • 2020-11-02
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
相关资源
最近更新 更多