如果 Long 不够长 (Java),我该怎么办?

What do I do when a Long isn't long enough (Java)?

所以,我正在研究 Project Euler 的底部。那里有很多大问题(其中大部分都超出我的水平)。但是我很快遇到了一个主要问题:

Java 不会做大数。

现在,如果我有能力制作采用替代路线的快速程序,这对我来说就不是问题了。可惜我不是那个人

以第20题为例,求100的数字和!我什至没有为数字解析而写,但我的代码找到阶乘失败了。

long onehfact = 1;
for(int i = 1; i <= 100; i++){
    onehfact = onehfact * i;
    System.out.println(onehfact);
}

这适用于大约 20 个序列,但开始给出随机的 19 位数字。通过 75 个序列,它只是给我零。

100!绝对不是零。

我需要一种方法来拥有非常大的数字,而科学记数法不适合我的目的。有没有我可以使用的大变量类型,它可以容纳 100-150 位数字的数字?是否有任何其他解决方案会产生相同的结果?

您可以使用BigInteger来满足您的要求。

BigInteger onehfact = BigInteger.valueOf(1L);
for(long i = 1; i <= 100; i++){
    onehfact = onehfact.multiply(i);    
    System.out.println(onehfact);
}

有一个名为 BigInteger 的 class 允许您处理和执行任何大小的数字的操作。它将为数字分配可变数量的内存。

这是文档。 class 在 java.math 包中:

http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

我也在 Java 解决了 Project Euler 中的一些问题。对于其他一些你正在处理大的非整数的问题,你需要相关的 class java.math.BigDecimal:

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html