我 不 要求解决这个谜题。
所以,我正在使用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才能停止。
正如我所说,我并不是在寻找这个谜语的解决方案,但我想知道我的代码是为了实现这个目的而做的。我还在学习,所以我的代码可能会相当丑陋,所以额外的业力指向可以帮助我解决这个问题的任何人。
答案 0 :(得分:4)
如果发现了回文,则不会递减变量。由于变量保持不变,因此再次发现相同的回文。它就这样......
答案 1 :(得分: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)
。
答案 2 :(得分:2)
没有回答你的问题,但你对布尔的使用是可怕的。记住布尔表达式返回一个布尔本身,你不需要另一个比较。即。
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)
答案 3 :(得分: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