如何在Clojure中解决整数溢出?

时间:2013-03-09 13:50:48

标签: clojure

我正在做这个练习。 Pascal's Trapezoid

我的解决方案是:

(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))))))

我通过了前三个测试用例,但最后一个失败了。

它说“java.lang.ArithmeticException:integer overflow”

那么,Clojure中有一个大整数,还是有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:8)

将+更改为+'。如果结果不适合long,那将自动为你提供一个clojure.lang.BigInt。您还可以在文字上使用N后缀来获取BigInt。

(class (+' 3 2)) ;=> java.lang.Long
(class (+' 300000000000000000000000000000 2)) ;=> clojure.lang.BigInt
(class 3N) ;=> clojure.lang.BigInt

答案 1 :(得分: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)))]