Ruby中的项目Euler#5 - 代码结果意外

时间:2013-08-05 07:47:00

标签: ruby

对于提出如此狭隘的问题抱歉。我试图解决Project Euler中的问题5(计算可以被1到20的所有数字整除的最小正数)来学习Ruby。

我写了以下代码:

def calc_min_multiple(array)
     array.each do |value|
         if div_check(value) == true
           return value
           break
         end
     end
end


def div_check(num)
  1.upto(20) do |divisor|
     if num % divisor != 0
        return false
     end
  end  
    return true
end

range = *(20..500000)
puts calc_min_multiple(range)

奇怪的是程序只是将每个值放在我定义的范围数组中,而不通过函数内部的所有逻辑。我试过调试但找不到问题。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

问题的答案“为什么我的方法会返回并返回我给它的数组?”是由于文档中有关each when you give a block.的内容。返回该数组。

答案 1 :(得分:0)

calc_min_mulitple方法

中存在几个问题
  1. div_check(value) == true。虽然它可以工作,但你不会像这样检查布尔相等。只需if div_check(value) trueif !div_check(value) false

  2. array.each阻止break语句无法访问,因为您之前是return false

答案 2 :(得分:-1)

您遇到的问题是因为您的代码没有尝试足够高的数字来满足标准。 (提示:它超过1E8,并且 age 以这种方式计算,这就是为什么它在Project Euler上!)

calc_min_multiple中的循环终止于数组的末尾时,它返回最后一个被评估的表达式each,它计算出它所作用的数组,所以你的{{1只打印数组元素的所有

因此,您需要puts方法中的特定return来表示未找到任何结果。

另一点。 Ruby calc_min_multiple也没有构建一个50万个元素数组,而是有一个range方法,所以你可以通过(unflattened)范围。

你也可以在这里有用地使用修复后的语句修饰符each,所以你的方法看起来像这样

if

<强>输出

def calc_min_multiple(range)
  range.each do |value|
    return value if div_check(value)
  end
  'None'
end

def div_check(num)
  1.upto(20) do |divisor|
    return false if num % divisor != 0
  end
  return true
end

puts calc_min_multiple(20..500_000)

最后,采用更加Rubyish的方式:

None