如何在Clojure中使用biginteger



我正在尝试计算Clojure中的第500个斐波那契数:

(defn fib-pair [[a b]] [b (+ a b)])
(nth (map first (iterate fib-pair [1 1])) 500)
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)

程序失败,因为数字太大:整数溢出。如何解决这个问题?

Clojure默认的整数类型是long。如果你想指定一个整数字面值应该被认为是一个clojure.lang.BigInt,只需在数字后面加上一个N

(defn fib-pair [[a b]] [b (+ a b)])
(nth (map first (iterate fib-pair [1N 1N])) 500)
;= 225591516161936330872512695036072072046011324913758190588638866418474627738686883405015987052796968498626N

您实际上可以只指定两个初始值中的一个作为BigInt,因为:

(+ 1N 1)
;= 2N
(type (+ 1N 1))
;= clojure.lang.BigInt

可以使用clojure。Core/+'代替clojure。core/+ in fib-pair

这将在需要时自动提升long值。

(defn fib-pair [[a b]] [b (+' a b)])

你也可以使用类型提示。

(defn fib-pair ^BigInteger [[^BigInteger a ^BigInteger b]] [b (+' a b)])
(nth (map first (iterate fib-pair [1 1])) 500)

查看更多信息http://dev.clojure.org/display/doc/Documentation为+ 1.3 +数字+工作

相关内容

  • 没有找到相关文章

最新更新