我如何处理大量数字?

时间:2008-11-07 22:34:43

标签: bignum

  

可能重复:
  Most efficient implementation of a large number class

假设我需要计算2 ^ 150000。显然,这个数字将超过int,float或double的大小。如何创建允许正常数学函数但超出基本数字类型的数据类型?

如果这是“依赖于您使用的语言”的那种交易。我会说C#。

9 个答案:

答案 0 :(得分:6)

答案 1 :(得分:3)

如果C#不是一成不变的,并且你想要一些开箱即用的东西,那么有几种选择。我最熟悉的是Python,但我认为像Scheme和Ruby这样的语言也支持大数字。

Python:2**150000。大约1秒后打印结果。

如果您想要免费的数学软件,请查看Maxima或Sage。

答案 2 :(得分:2)

您也可以考虑使用Frink,这是一种具有处理测量单位的本机功能的语言。 它毫无困难地计算2 ^ 150000,处理分数(例如1/3 + 2/5 - > 11/15),计算3米+2英寸 - > 3.0508米,是一种完整的编程语言。

Frink - 版权所有2000-2008 Alan Eliasen,eliasen @ mindspring.com  http://futureboy.us/frinkdocs/

答案 3 :(得分:1)

多种语言都支持任意大数字。例如,您可以使用Mathematica。我在Mathematica中尝试了你的例子,结果有45,155位数字。我在Unix机器上尝试使用bc的相同示例。 bc支持扩展精度,但不支持扩展;它轰炸了这个例子。

答案 4 :(得分:1)

Lisp是你的朋友。默认的大整数。

答案 5 :(得分:1)

我发现使用没有任意大数字的语言非常令人沮丧:能够在大多数数字上使用普通运算符(如加法)似乎是荒谬的,但是因为它的大小而必须切换到BigInt实例上的方法调用

一大堆语言拥有更完整的数字塔,并在需要时无缝强制;例如,Allegro Common Lisp在1ms内评估并打印所有45,155位(expt 2 150000)。

cl-user(2): (time (expt 2 150000))
; cpu time (non-gc) 0 msec user, 0 msec system
; cpu time (gc)     0 msec user, 0 msec system
; cpu time (total)  0 msec user, 0 msec system
; real time  1 msec
; space allocation:
;  2 cons cells, 18,784 other bytes, 0 static bytes

答案 6 :(得分:1)

C中有一个名为calc的产品,它是一个任意精度的计算器。作为一名研究人员,我曾经使用过一次,发现它使用起来相当简单......

http://sourceforge.net/projects/calc/

可以对困难或长时间的计算进行编程,并且可以接受来自命令行的参数。在交互模式下,它一次接受一个命令,并显示答案。

通常命令只是表达式,例如:

    3 * (4 + 1)

和calc将打印:

    15

Calc执行算术运算符+, - ,/,*以及^(取幂),%(模数)和//(整数除)。

例如:

    3 * 19 ^ 43 - 1

将产生:

    29075426613099201338473141505176993450849249622191102976

Calc值可能非常大。例如:

    2 ^ 23209 - 1

将打印:

    402874115778988778181873329071 ... loads of digits ... 3779264511

希望这会有所帮助......

答案 7 :(得分:0)

我不知道C#,但我知道Ruby编程语言有BigDemical类似乎允许无限大小的数量。

答案 8 :(得分:0)

Python有一个bignum库。如果您需要用另一种语言实现bignum库,您至少可以使用Python作为验证工作的参考。请注意,如果您不知道自己在寻找什么,那么bignums有一些实现问题并不是很明显。