Ruby - 逐个减少params中的整数并循环使用

时间:2016-07-25 12:50:41

标签: ruby loops

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

找到由两个 3位数字的乘积制成的最大回文。 我对Ruby和编码很陌生,所以很长一段时间都在努力解决这个问题。这就是我所拥有的:

def biggest(num, num2)
  total = num * num2
  x = total.to_s.split('')

  until x[0] == x[-1] && x[1] == x[-2] && x[2] == x[-3]
    num = num - 1
    num2 = num2 - 1
    total = num * num2
    x = total.to_s.split('')
  end

  return x
end

p biggest(999, 999)

问题是这会同时减少两个参数并给出错误的答案。我想我应该一次只减少一个数字:999 - 1 * 999,如果不满足条件,请减少其他数字:999 - 1 * 999 - 1。并保持这样循环直到真实。

我知道这不是这种方法的最佳方法。我认为从数学方面来说甚至是错误的,但我只是在学习,所以我恳请一些关于如何改进这些代码的见解。任何可选方法都是非常受欢迎的,但对我来说最重要的是如何解决我在这里犯下的错误。

1 个答案:

答案 0 :(得分:2)

正如您自己发现的那样,您的实施不起作用的主要原因是因为您减少numnum2,因此迭代[i, i]对而非{{1} }。

你的第二个问题是,即使你一个接一个地递减它们,你的[i, j]仍然认为解决方案必须是until对,[n0, m0]max(n0, m0) >= max(ni, mj) 1}}。

你的第三个问题是风格 - Ruby是一种更高级别的语言,但你手动比较字符。这是一个可能的解决方案:

∀ni, mj: ni ∈ 100..999, mj ∈ 100..999 and ni * mj is palindrome

(请注意,从max = 0 100.upto(999) do |x| x.upto(999) do |y| product = x * y max = product if product > max and product.to_s.reverse.to_i == product end end max 而不是x开始的第二个索引只是一个优化)