【问题标题】:Project Euler 1 too slow with triangular numbersProject Euler 1 对于三角数太慢了
【发布时间】:2017-02-18 07:39:17
【问题描述】:

我试图解决欧拉计划问题 1。我注意到一个序列导致每 15 个数字更快地解决。

这是 Clojure 代码

  (defn fifteenator [n]
  (* 15 (+ (* (+ 1 n) 3) (* (/ (+ (* n n) n) 2) 7))))

对于 15 n 是 0 对于 30 n 是 1 等等。

所以我可以计算能被 15 整除的最接近的数字,并且只进行一些递归计算。但仍然有一个 HackerRank 测试用例超时。在我开始分析代码之前,我想确定我的推理是否正确。有没有更快的计算方法,还是我应该学习分析 Clojure?

【问题讨论】:

  • 您是否考虑过改用applyfilter
  • 您可以通过将语句包装在 time 中来计算评估时间,该语句会打印出标准输出所需的时间。
  • 几点提示: 1、in但不包括(range i n i)的倍数序列是(range i n i)。 2. 您可以使用(reduce + ...)(apply + ...) 对序列求和。 3. 如果将 3 的倍数和 5 的倍数相加,则将 15 的倍数数两次。使用arithmetic progressions的代数有更快的解决方案
  • SBCL Common Lisp 中的相同算法在不到一秒的时间内完成了所有的谜题。我想我需要学习分析 Clojure。
  • 好吧,您提供的代码仅由基本数学组成,不是递归的。因此,该功能不应超过几纳秒。由于您没有将算法的其余部分提供给我们,因此我们无法确定是否有更快的方法。

标签: clojure


【解决方案1】:

我不确定你的方法。 Clojure 对范围和过滤器有很好的支持。有了这些求解 Euler 1 并不太难:

(defn euler1 
  [n] 
  (reduce + 
    (filter #(or (= (rem % 5) 0) (= (rem % 3) 0)) (range n))))

测试我们是否得到正确的结果:

user=> (euler1 10)
23

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多