代码之家  ›  专栏  ›  技术社区  ›  dbyrne

克罗朱尔的Euler#9计划(毕达哥拉斯三胞胎)

  •  6
  • dbyrne  · 技术社区  · 14 年前

    我的答案是 problem solutions in C .

    有没有人有什么建议可以让这个更清晰?

    (use 'clojure.test)
    (:import 'java.lang.Math)
    
    (with-test
      (defn find-triplet-product
        ([target] (find-triplet-product 1 1 target))
        ([a b target]
          (let [c (Math/sqrt (+ (* a a) (* b b)))]
            (let [sum (+ a b c)]
              (cond 
                (> a target) "ERROR"
                (= sum target) (reduce * (list a b (int c)))
                (> sum target) (recur (inc a) 1 target)
                (< sum target) (recur a (inc b) target))))))
    
      (is (= (find-triplet-product 1000) 31875000)))
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Yin Zhu    14 年前
        2
  •  4
  •   Bozhidar Batsov    14 年前

    我个人使用了这个算法(我发现 here

    (defn generate-triple [n]
      (loop [m (inc n)]
        (let [a (- (* m m) (* n n))
              b (* 2 (* m n)) c (+ (* m m) (* n n)) sum (+ a b c)]
          (if (>= sum 1000)
            [a b c sum]
            (recur (inc m))))))
    

    在我看来没那么复杂:-)