我试图找到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
语句中,该语句应该检查其回文结果,但是我的代码即使在达到正确的值后也会继续进行。有没有人在这里看到我做错了什么?
答案 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所指出的那样,即使有效,它也无法给出正确的结果。问题在于迭代的顺序。您按顺序递减i
和j
,例如:
...
..., [i, j], [i, j - 1], ...,
..., [i - 1, j], [i -1, j - 1], ...,
...
根据此顺序,您假设i * (j - 1)
大于(i - 1) * j
,因此如果它们都满足条件,则应选择其中较早的i * (j - 1)
flex
作为更大的数字,停止迭代继续后者。但关于排序的假设是错误的。