如果 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
所以,我正在研究 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