2

私はこの運動をしています。パスカルの台形

私の解決策は次のとおりです。

(fn pascal[initseq]
  (let [gen-nextseq (fn [s]
                      (let [s1 (conj (vec s) 0)
                            s2 (cons 0 s)]
                        (map + s1 s2)))]
    (cons 
      initseq 
      (lazy-seq 
        (pascal 
          (gen-nextseq initseq))))))

最初の 3 つのテスト ケースには合格しましたが、最後の 1 つは失敗しました。

「java.lang.ArithmeticException:整数オーバーフロー」と表示されます

では、Clojure には大きな整数がありますか、それとも問題を解決するためのより良い方法はありますか?

4

2 に答える 2

8

+ を +' に変更します。結果が long に収まらない場合は、自動的に clojure.lang.BigInt が取得されます。リテラルに N サフィックスを使用して、BigInt を取得することもできます。

(class (+' 3 2)) ;=> java.lang.Long
(class (+' 300000000000000000000000000000 2)) ;=> clojure.lang.BigInt
(class 3N) ;=> clojure.lang.BigInt
于 2013-03-09T13:58:39.727 に答える
2

任意の精度+'の代わりに使用できます。+

(fn pascal[initseq]
  (let [gen-nextseq (fn [s]
                      (let [s1 (conj (vec s) 0)
                            s2 (cons 0 s)]
                        (map + s1 s2)))]
                             ^^
...

したがって、上記のコードのマークされた部分を次のように変更できます。

                        (map +' s1 s2)))]
于 2013-03-09T13:58:51.280 に答える