我一直在学习 Ruby,所以我想我应该尝试一下项目中的一些 Euler 难题。尴尬的是,我只完成了问题 4...
问题 4 如下:
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
所以我想我会在嵌套的 for 循环中从 999 循环到 100 并测试回文,然后在找到第一个(应该是最大的)时跳出循环:
final=nil
range = 100...1000
for a in range.to_a.reverse do
for b in range.to_a.reverse do
c=a*b
final=c if c.to_s == c.to_s.reverse
break if !final.nil?
end
break if !final.nil?
end
puts final
这确实输出了回文 580085,但显然这不是范围内两个三位数的最高乘积。奇怪的是,如果我将范围更改为 10...100,相同的代码会成功返回 9009,就像在示例中一样。
- 有人能告诉我我要去哪里吗 错了吗?
- 还有,有没有更好的方法 跳出内部循环?
谢谢
最佳答案
你正在测试 999* (999...100),然后是 998 * (999...100)
因此您将在测试 997 * 996 之前测试 999 * 500。
那么,我们如何找到正确的数字?
首先请注意乘法是反射性的,a * b == b * a,所以 b 不必每次都从 999...0 开始,只需 a ...0。
当你找到一个回文,将两个因子相加并保存总和(也保存两个因子)
在循环内部,如果 (a+b) 小于保存的总和,则放弃内部循环并移动到下一个 a。当 a 低于 sum/2 时,您找不到的 future 值不会高于您已经找到的值,所以您完成了。
关于ruby - 对回文产品问题感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461881/