0

很抱歉问了这么狭窄的问题。我正在尝试解决 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)

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

4

3 回答 3

1

“为什么我的方法返回并返回我给它的数组?”这个问题的答案 是由于文档中关于each您给出块时的说明。. 该数组被返回。

于 2013-08-05T08:27:44.873 回答
0

calc_min_mulitple方法有几个问题

  1. div_check(value) == true. 尽管它会起作用,但您不会像这样检查布尔相等性。只需执行if div_check(value)fortrueif !div_check(value)for false

  2. array.eachbreak语句是不可达的,因为你return false在它之前。

于 2013-08-05T08:31:36.240 回答
-1

您遇到的问题是因为您的代码没有尝试足够高的数字来满足标准。(提示:它已经超过1E8,而且需要很长时间才能计算出来,这就是为什么它在 Project Euler 上!)

当循环 incalc_min_multiple在数组末尾终止时,它返回最后一个评估的表达式,它是each,它评估它所作用的数组,因此您puts只需打印所有数组元素。

所以你需要一个特定returncalc_min_multiple方法来表示没有找到结果。

还有一点。rangeRuby也有一个方法,而不是构建一个包含 50 万个元素的数组,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)

输出

None

最后,一个更 Rubyish 的方式来做到这一点:

def calc_min_multiple(range)
  range.find { |value| div_check(value) }
end

def div_check(num)
  (1..20).all? { |divisor| num % divisor == 0 }
end

puts calc_min_multiple(20..500_000)
于 2013-08-05T09:50:21.280 回答