何在具有 2GB RAM 的 32 位计算机上进行计算。当我进行长数运算时,程序开始给出垃圾值。但我想计算数以万计的数字。任何语言都可以接受。
9 回答
使用 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);
}
}
您可以使用 Java BigInteger 或任何其他 Big Integer 实现
例子:
BigInteger left = new Biginteger("1845618948745415218748");
BigInteger right = new BigInteger("1845452132132132123132123123");
out.println(left.add(right));
这里使用的库是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
立即为我执行。无论如何,字符串连接/随机数生成是瓶颈。
所有 Common Lisp 实现都包含任意长度的整数。通常实现平底船到 C 库来处理它,但在 Lisp 中工作更方便。
例如,看看 Clisp、SBCL 或 CMUCL(网络搜索将找到这些项目的主页)。
这不是语言问题,而是数学问题:http ://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic一个众所周知的问题,并且存在大量编程库来为您解决问题。
这个问题很抽象,是的,实现这样的计算器是可能的。在某些时候,您可能不得不依赖磁盘缓存和手动实现操作,而不是依赖现有的类(例如 Java 的 BigInteger),但它在技术上是可行的。
对的,这是可能的。这是一个公共域 C++ 库,仅用于:https ://mattmccutchen.net/bigint/
这里存在很好的算法,您可以使用定义 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 ...
* 和 / 等也是如此,然后您读取字符串类型并创建字符串输出。