Fixnum与nil失败的比较 - 回文程序Ruby

时间:2015-06-08 23:48:38

标签: arrays ruby null palindrome fixnum

我正在为Euler项目中的问题4开发一个程序 - 在3位数字的倍数中找到最大的回文。这就是我写的:

def palintest(number)
    num = number.to_s
    len = num.length

    if len  % 2 != 0
        num[(len/2).floor] = ''
    end

    if num[0.. (len/2)-1] == num [len/2..len].reverse!
        return number
    end
end

palindromes = []

for i in 100..999
    for j in 100..999
        palindromes << palintest(i*j)
    end
end

puts palindromes.max

我收到一条错误消息:

comparison of Fixnum with nil failed
(repl):24:in `each'
(repl):24:in `max'
(repl):24:in `initialize'

我无法弄清楚发生了什么,我已经测试了程序的每个组件,它似乎处于正常运行状态。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

乍一看,这是因为当i * j不是回文时,palintest(i * j)返回nil。

快速修复:

puts palindromes.reject(&:nil?).max

答案 1 :(得分:1)

你有一堆nils要添加到你的数组中。 Max无法使用nils - 它会比较每个元素。只需添加palindromes << palintest(i*j) if palintest(i*j)

即可

但真的可能会更好地阅读:

def palindrome?(number)
    num = number.to_s
    len = num.length

    num[(len/2).floor] = '' unless len.even?        

    num[0..(len/2)-1] == num[len/2..len].reverse # return boolean
end

palindromes = []

for i in 100..999
    for j in 100..999
        palindromes << (i * j) if palindrome?(i * j)
    end
end

puts palindromes.max