当前位置: 首页 > 知识库问答 >
问题:

缓慢的Ruby计算?欧拉项目#5

姜奇
2023-03-14

这个问题参考了欧拉项目问题5,所以要小心剧透!问题5:

2520是可以被1到10的每个数字除的最小数,没有任何余数。可以被1到20的所有数字整除的最小正数是多少?

我用Ruby编写了以下代码作为问题5的解决方案。

num = 2520
until (1..20).all?{|x| num % x == 0}
  num += 1
end
puts "#{num}"        

然而,每当我运行脚本时,它都会挂起。请注意,我在1到10范围内的基本情况2520上测试了相同的方法,效果很好。

为什么它适用于更简单的情况,但不适用于更高级的情况?我能做些什么来修复我所拥有的?

共有3个答案

姚新霁
2023-03-14

比赛有点晚了,但这是我的意见。如果你喜欢简洁明了的代码,你可以做一些小的调整,让它运行得更快。这在没有超时的情况下对我有效:

num = 20

  until (11..20).all?{ |i| num % i == 0 }
    num +=20
  end

puts num

本质上,你只需要增加20秒,因为你知道它需要被20整除,你可以跳过迭代通过集合的低1/2的任何东西。

房学文
2023-03-14

你不能像对待别人那样粗暴地对待这个问题。你需要找到一个更有效的解决方案。

这是一种更有效的方法(如果这不是很像Ruby,请道歉):

def find_multiple
  lcm = 1

  (2..20).each do |i|
    lcm *= i / gcd(lcm, i)
  end

  lcm
end

def gcd(a, b)
  while b > 0
    a %= b
    return b if a == 0
    b %= a
  end

  a
end

puts find_multiple

如果您正在寻找一种更像Ruby的方法来解决这个问题,您可以使用以下方法(正如steenslag在评论中建议的那样):

(1..20).inject(:lcm)
陈实
2023-03-14

它很慢,因为答案不止2亿,而且你要按1的步骤计数。这需要一段时间。你需要一个更好的算法。

 类似资料:
  • 我试图通过求和以下数列来制作一个程序来近似e: e=1 (1 / 1!) (1 / 2!) (1 / 3!) .... (1/i!) 目前,我的代码如下所示: 该程序成功地执行了n的计算(1/n!) e=2 e=2.5 线程“main”java中出现异常。算术异常:非终止十进制扩展;没有可精确表示的十进制结果。在爪哇。数学大十进制。在ch10处分开(未知来源)。第10章近似值。main(第10章E

  • 带渐变后: 30秒/80秒(带清洁) 我对解决方案进行了分析: 结果报告中的主要任务是以下任务:(在没有清洁的构建中) Build.Gradle:

  • 我有一个表,有3000000条记录。 +--------+ 计数(*) +--------+ 发生什么事了?

  • 本文向大家介绍欧拉图,包括了欧拉图的使用技巧和注意事项,需要的朋友参考一下 欧拉图-如果存在包含图G的每个边的闭合轨迹,则连通图G称为欧拉图。 欧拉路径-欧拉路径是仅使用图形的每个边缘一次的路径。欧拉路径在不同的顶点处开始和结束。 欧拉电路-欧拉电路是只使用图形的每个边一次的电路。欧拉电路始终在相同的顶点处开始和结束。当且仅当G的所有顶点均具有偶数度时,连通图G是欧拉图,而当且仅当其边缘集可分解为

  • 13195的主要因子为5、7、13和29。数字600851475143中最大的素因子是什么? 我用自己的方式在Euler项目上解决了这个问题,速度很慢,然后我在某人的github帐户上找到了这个解决方案。我不明白为什么它会起作用。为什么删除了许多因子,这些因子等于一个指数?有什么见解吗?