ruby - 对回文产品问题感到困惑

标签 ruby math puzzle palindrome

我一直在学习 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/

相关文章:

java - 如何使用 jeval 计算指数形式的数字?

algorithm - 使用基于整数除法的例程进行计数 - 是否有公式化方法?

c++ - 如何隐藏数独表中的数字?

ruby - 无法使用基本身份验证模拟网站

ruby - 使用 Ruby open3 标准库时捕获失败

c# - 用指数计算公式

c# - Excel 求解器 : Non linear least squares equivalent in C#

javascript - 如何删除照片

ruby-on-rails - 在 Ruby on Rails 中搜索名字、姓氏或全名范围

ruby - Ruby 中的分段文件上传