python ProjectEuler任务4使用while循环

时间:2017-01-18 18:23:10

标签: python

我想通过使用python来完成项目的euler问题。 但我遇到以下任务的问题:

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。 找到由两个3位数字的乘积制成的最大回文。

我给定任务的代码:

def palindrome_number():
  n=0 
  lower_range = 100
  upper_range = 999
  while x >= lower_range or x <= upper_range and y >= lower_range or y <= upper_range:
    z = x * y
    while z > n:
      s = str(x * y)
      if s == s[::-1]:
        n = x * y
  print(n)

现在我不知道如何检查从100-999变化的所有x和y数字。 我认为它必须像我的代码,但它不起作用

1 个答案:

答案 0 :(得分:0)

解决方案1:使用生成器表达式

实际上问题可以在一行中解决:)

max(x*y for x in range(100, 1000) for y in range(100, 1000) if str(x*y)==str(x*y)[::-1])

解决方案2:使用for循环

for循环比while循环更适合这种操作。下面是解决方案(我只用两个for循环替换了你的while。第一个循环告诉变量x从100到999运行,第二个循环告诉y执行相同。使用这两个循环,您将尝试xy的所有组合。)

def palindrome_number():
    n = 0
    lower_range = 100
    upper_range = 999
    for x in range(lower_range, upper_range+1):
        for y in range(lower_range, upper_range+1):
            z = x * y
            if z > n:  # an *if* suffices ;)
              s = str(x * y)
              if s == s[::-1]:
                n = x * y
    print(n)

解决方案3:使用while循环

要使用while循环获得相同的内容,您必须注意更改xy以获取所有组合:

x = y = lower_range
while x >= lower_range and x <= upper_range:  # (*and* instead of *or*)
    while y >= lower_range and y <= upper_range:  # (again you want the >= *and* the <= to be fulfilled)
        z = x * y
        if z > n:
            s = str(x * y)
            if s == s[::-1]:
                n = x * y
        y += 1  # change y to get all combinations
    y = lower_range
    x += 1  # change x to get all combinations