-3

何在具有 2GB RAM 的 32 位计算机上进行计算。当我进行长数运算时,程序开始给出垃圾值。但我想计算数以万计的数字。任何语言都可以接受。

4

9 回答 9

6

使用 Java 的BigInteger,几乎立即执行:

import java.math.BigInteger;
import java.util.Random;

public class Int10k {

    public static final void main(String[] args) {
        BigInteger  a, b, c;
        Random rnd;

        // Here I'll create two random 40,000-bit numbers (that's
        // rather more than 10,000 decimal digits) and add them
        // together. For specific numbers, you can use the
        // BigInteger(String) constructor, which creates a
        // BigInteger based on a String of digits.
        rnd = new Random();
        a = new BigInteger(40000, rnd);
        b = new BigInteger(40000, rnd);
        c = a.add(b);

        System.out.println(a);
        System.out.println("+");
        System.out.println(b);
        System.out.println("=");
        System.out.println(c);
    }
}
于 2012-07-21T13:04:36.150 回答
3

您可以使用 Java BigInteger 或任何其他 Big Integer 实现

例子:

BigInteger left = new Biginteger("1845618948745415218748");
BigInteger right = new BigInteger("1845452132132132123132123123");

out.println(left.add(right));
于 2012-07-21T12:53:48.743 回答
3

这里使用的库是BC Math。它默认包含在 PHP 中。

$big_int1 = "";
$big_int2 = "";

for( $i = 0; $i < 10000; ++$i ) {
    $big_int1 .= mt_rand(0,9);
    $big_int2 .= mt_rand(0,9);
}//0.019520044326 seconds or 20 milliseconds

echo bcadd( $big_int1, $big_int2 ); //0.00037407875061035 seconds or 374 microseconds

立即为我执行。无论如何,字符串连接/随机数生成是瓶颈。

于 2012-07-21T12:55:10.533 回答
2

以下是各种语言的一些方便的链接:

  • Python(内置)
  • C/C++ - GMP,可能是最高效的通用任意精度数库
  • .NET 4(内置)
  • .NET - GnuMpDotNet - 使用GMP,因此也非常高效,但由于运算符重载等原因,它更易于使用
  • Java(内置)
  • PHP - BC 数学
于 2012-07-21T13:17:57.067 回答
1

所有 Common Lisp 实现都包含任意长度的整数。通常实现平底船到 C 库来处理它,但在 Lisp 中工作更方便。

例如,看看 Clisp、SBCL 或 CMUCL(网络搜索将找到这些项目的主页)。

于 2013-06-18T19:45:00.890 回答
1

这不是语言问题,而是数学问题:http ://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic一个众所周知的问题,并且存在大量编程库来为您解决问题。

于 2012-07-21T13:00:48.207 回答
0

这个问题很抽象,是的,实现这样的计算器是可能的。在某些时候,您可能不得不依赖磁盘缓存和手动实现操作,而不是依赖现有的类(例如 Java 的 BigInteger),但它在技术上是可行的。

于 2012-07-21T12:56:03.637 回答
0

对的,这是可能的。这是一个公共域 C++ 库,仅用于:https ://mattmccutchen.net/bigint/

于 2012-07-21T12:56:34.217 回答
0

这里存在很好的算法,您可以使用定义 2 数组 [0-9] 并根据每个结果定义一个新数组:

{0,1,2,3,4,5,6,7,8,9}
{0,1,2,3,4,5,6,7,8,9}
/////

然后你可以定义一个放置+结果的二维数组:

0 1 ....
1 ...

* 和 / 等也是如此,然后您读取字符串类型并创建字符串输出。

于 2012-07-21T12:59:31.997 回答