-1

不是要解决这个谜语。

因此,我正在使用 Ruby 解决 Project Euler 问题。

我用以下方法做了一个回文检查器:

def is_palindrome(n)
  if n.to_s == n.to_s.reverse
      true
  else
      false
  end
end

使用这个,我使用下一个方法来尝试找到由两个 3 位数字组成的最大回文。

x = 999
y = 998

while y > 100
  if is_palindrome(x * y) == true
    puts (x * y)
  else
    x-=1
    y-=1
  end
end

结果是终端完全适合并卡在 289982 上,必须按 Ctrl+C 才能停止。

正如我所说,我不是在寻找这个谜语的解决方案,但我想知道我的代码正在做什么来实现这一点。我还在学习,所以我的代码可能相当丑陋,所以额外的业力指向任何可以帮助我解决这个问题的人。

4

4 回答 4

4

万一找到回文,你就不会减少你的变量。由于变量保持不变,因此再次找到相同的回文。就这样……

于 2012-12-06T00:37:29.363 回答
4

Amadan 解决了你的问题,所以我会去争取额外的业力点 :)

首先,您可以只做if something而不是if something == true.

另外,你不需要做

if something == something_else
  true
else
  false
end

因为==运算符返回true或者false已经返回,所以你的is_palindrome方法可以像

def is_palindrome(n)
  n.to_s == n.to_s.reverse
end

此外,在 Ruby 中,您通常会看到像这样的方法(布尔检查),在末尾带有问号,因为这真的就像您在问它是/否的问题!所以通常你会看到那个叫做is_palindrome?(n). 您可能会在其他地方看到类似的Array#empty?Hash#has_key?(k)

于 2012-12-06T00:51:34.030 回答
2

没有回答你的问题,但你对布尔值的使用是可怕的。记住布尔表达式本身返回一个布尔值,你不需要另一个比较。IE

def is_palindrome(n)
  if n.to_s == n.to_s.reverse
      true
  else
      false
  end
end

应该:

def is_palindrome(n)
  n.to_s == n.to_s.reverse
end

while y > 100
  if is_palindrome(x * y) == true

应该

while y > 100
  if is_palindrome(x * y)
于 2012-12-06T00:52:01.003 回答
1

这是我的解决方案:

# Find largest palindrome made from the product of two 3-digit numbers

largest = 0
for i in 100..999
  for j in i..999
    product = j*i
    # Check for palindrome and determine largest
    largest = product.to_s == product.to_s.reverse && product > largest ? product : largest
  end
end
p largest
于 2013-03-28T14:33:37.420 回答