回文产品

时间:2016-04-08 16:18:22

标签: ruby

我试图找到2个三位数字的最大产品,这是一个回文。答案是993 * 913 = 906609。

这是我的代码:

x = 123

until x == x.to_s.reverse.to_i
  999.downto(100) do |i|
    i.downto(100) do |j|
      x = i * j
      puts "#{i} * #{j} = #{x}"
    end
  end
end

puts x

我将所有内容都包含在until语句中,该语句应该检查其回文结果,但是我的代码即使在达到正确的值后也会继续进行。有没有人在这里看到我做错了什么?

4 个答案:

答案 0 :(得分:3)

即使您的代码有效,也会选择995 * 585 = 580085,因为没有逻辑可以选择具有最高价值的回文。

因此,您可能希望收集数组中的所有回文,然后从该数组中找到max,如下所示:

arr = []
999.downto(100) do |i|
    i.downto(100) do |j|
      x = i * j
      arr << x if x.to_s == x.to_s.reverse
    end
end

p arr.max
#=> 906609

答案 1 :(得分:1)

尝试用简单的英语思考你的代码要做什么:

“直到x是回文,执行这个双重嵌套循环才能完成”

直到循环永远不会破坏,因为在检查x是否为回文之前,它是完全运行两个循环。当你找到一个回文时,解决办法就是破坏试试这个:

999.downto(100) do |i|
  i.downto(100) do |j|
    x = i * j
    break if x == x.to_s.reverse.to_i
    puts "#{i} * #{j} = #{x}"
  end
  break if x == x.to_s.reverse.to_i
end

puts x

啊但是现在我们已经遇到了另一个问题 - 以这种方式循环并不能保证产品将是最高的产品。我们可以略微修改来实现这个目标:

palindromes = []

999.downto(100) do |i|
  i.downto(100) do |j|
    x = i * j
    palindromes << x if x == x.to_s.reverse.to_i
  end
end

puts palindromes.max

这可能不是最佳解决方案,但它确实有效。

答案 2 :(得分:0)

问题是从不检查条件,因为内部循环一直运行直到完成而没有将执行返回到直到循环

你可以这样做

x = 123
999.downto(100) do |i|
  i.downto(100) do |j|
    x = i * j
    puts "#{i} * #{j} = #{x}"
    break if x == x.to_s.reverse.to_i
  end
end

puts x

无论如何这(作为你的初始解决方案,如果它有效)将不会给你最大的回文,但它找到的第一个。

答案 3 :(得分:-1)

外部until循环由条件x == x.to_s.reverse.to_i控制,但内部两个downto循环不受该条件控制。当在两个downto循环的中间满足条件时,这对于在两个downto循环的中间停止没有任何影响,它只会停止until循环继续下一次迭代。

正如Wand Maker所指出的那样,即使有效,它也无法给出正确的结果。问题在于迭代的顺序。您按顺序递减ij,例如:

...
..., [i, j],     [i, j - 1], ...,
..., [i - 1, j], [i -1, j - 1], ...,
...

根据此顺序,您假设i * (j - 1)大于(i - 1) * j,因此如果它们都满足条件,则应选择其中较早的i * (j - 1) flex作为更大的数字,停止迭代继续后者。但关于排序的假设是错误的。