首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3和5的倍数

3和5的倍数
EN

Code Review用户
提问于 2014-11-24 03:48:52
回答 2查看 345关注 0票数 0

项目Euler问题#1:

如果我们列出所有低于10的自然数,它们是3或5的倍数,我们得到3,5,6和9。这些倍数之和是23。求N以下3或5的倍数之和。

我的代码是正确的,但我不知道如何优化,使之更快。

代码语言:javascript
复制
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
EN

回答 2

Code Review用户

回答已采纳

发布于 2014-11-24 11:16:07

你用一个常数N作为变量..。不可怕,但有点混乱。

您首先询问用户他们想运行多少次代码,然后对哪个数字求和3&5的mods;只编写要求一个数字并计算和的代码就更简单了--如果用户想多次运行它,那么就让他们:)

不需要从0开始,1和2永远不会被3整除(尽管我们需要添加一些验证,以防用户添加一个非常低的数字)。

与设置中间arr值和使用each迭代不同,您可以使用select来获得返回块为true的数字。

但是你的主要问题是速度--你是否对你的代码进行了基准测试,以确定速度是否是一个问题?

代码语言:javascript
复制
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(:+)
票数 3
EN

Code Review用户

发布于 2014-12-16 06:55:35

如果您想编写惯用的Ruby代码,我会推荐Pavling的答案。它的可读性要强得多,而且很明显发生了什么。

你可以通过少做一些事情来使它表现得更好。您正在做一件完全没有必要的事情:将每个数字存储在Array中。跳过这一步,只对数字求和,效率要高得多。为了获得额外的效率,请使用while循环而不是Enumerator

代码语言:javascript
复制
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

现在我们所做的只是算术。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/70680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档