如果我们列出所有低于10的自然数,它们是3或5的倍数,我们得到3,5,6和9。这些倍数之和是23。求N以下3或5的倍数之和。
我的代码是正确的,但我不知道如何优化,使之更快。
N = gets.to_i
N.times do
arr = []
(0...gets.to_i).each { |j| arr << j if j % 3 == 0 || j % 5 == 0 }
puts arr.reduce(:+)
end发布于 2014-11-24 11:16:07
你用一个常数N作为变量..。不可怕,但有点混乱。
您首先询问用户他们想运行多少次代码,然后对哪个数字求和3&5的mods;只编写要求一个数字并计算和的代码就更简单了--如果用户想多次运行它,那么就让他们:)
不需要从0开始,1和2永远不会被3整除(尽管我们需要添加一些验证,以防用户添加一个非常低的数字)。
与设置中间arr值和使用each迭代不同,您可以使用select来获得返回块为true的数字。
但是你的主要问题是速度--你是否对你的代码进行了基准测试,以确定速度是否是一个问题?
n = gets.to_i
return 0 unless n > 2 # you could do this as a ternary or `if` statement if you prefer
(3...n).select { |j| j % 3 == 0 || j % 5 == 0 }.reduce(:+)发布于 2014-12-16 06:55:35
如果您想编写惯用的Ruby代码,我会推荐Pavling的答案。它的可读性要强得多,而且很明显发生了什么。
你可以通过少做一些事情来使它表现得更好。您正在做一件完全没有必要的事情:将每个数字存储在Array中。跳过这一步,只对数字求和,效率要高得多。为了获得额外的效率,请使用while循环而不是Enumerator。
n = gets.to_i
j = 3
r = 0
while j < n
r += j if j % 3 == 0 || j % 5 == 0
j += 1
end
puts r现在我们所做的只是算术。
https://codereview.stackexchange.com/questions/70680
复制相似问题