Yar*_*Yar 0 clojure integer-overflow long-integer
我有一个简单的电源功能,我想用两个大数字做这样的事情:
(def y 19859145917581983573N)
(def p 27829350753993985481N)
(defn power
[x n]
(reduce *' (repeat n x))
)
(power y p)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
IllegalArgumentException Value out of range for long: 27829350753993985481 clojure.lang.RT.longCast (RT.java:1210)
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?
您将不得不找到一种比简单重复乘法更有效的求幂方法.你要求你的计算机执行27次quintillion bigint乘法!即使我们非常慈悲地假设您每秒可以执行十亿次这样的操作,您需要900年才能完成此计算.
但是我们假设你愿意等那么久.您还必须在计算机上执行一些内存升级:由此产生的数字将占用(非常大)您计算机上的空间与互联网的整个存储容量(截至2016年:当您最终完成倍增时) ,在2900年,他们可能会有这种尺寸的拇指驱动器).
如果这对你来说也没问题,那么你只需编写一个版本repeat,使用bigint来计算重复次数而不是long:
(defn repeat' [n x]
(lazy-seq
(when (> n 0N)
(cons x (repeat' (dec' n) x)))))
Run Code Online (Sandbox Code Playgroud)