Java中的大数
Posted
技术标签:
【中文标题】Java中的大数【英文标题】:Large Numbers in Java 【发布时间】:2010-10-25 09:20:54 【问题描述】:如何在 Java 中进行非常大的数字计算?
我已经尝试过long
,但它的最大值为 9223372036854775807,当使用整数时,它不能保存足够的数字,因此对于我的需要来说不够准确。
还有这个问题吗?
【问题讨论】:
9223372036854775807
是 Long.MAX_VALUE
的确切值,无论如何。
【参考方案1】:
您可以将BigInteger
类用于整数,将BigDecimal
用于具有十进制数字的数字。这两个类都在java.math
包中定义。
例子:
BigInteger reallyBig = new BigInteger("1234567890123456890");
BigInteger notSoBig = new BigInteger("2743561234");
reallyBig = reallyBig.add(notSoBig);
【讨论】:
如果您打算使用 BigInteger 类进行计算,可能值得一提(尽管对大多数人来说很明显,我猜)继承性能损失。 @haylem 性能速度相同,但数字的长度使其需要时间。他们使用按位运算符进行计算。就像用原始类型做数学时通常发生的一样。【参考方案2】:使用作为 Java 库一部分的 BigInteger
类。
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html
【讨论】:
【参考方案3】:这是一个很快就能得到大数字的例子。
import java.math.BigInteger;
/*
250000th fib # is: 36356117010939561826426 .... 10243516470957309231046875
Time to compute: 3.5 seconds.
1000000th fib # is: 1953282128707757731632 .... 93411568996526838242546875
Time to compute: 58.1 seconds.
*/
public class Main
public static void main(String... args)
int place = args.length > 0 ? Integer.parseInt(args[0]) : 250 * 1000;
long start = System.nanoTime();
BigInteger fibNumber = fib(place);
long time = System.nanoTime() - start;
System.out.println(place + "th fib # is: " + fibNumber);
System.out.printf("Time to compute: %5.1f seconds.%n", time / 1.0e9);
private static BigInteger fib(int place)
BigInteger a = new BigInteger("0");
BigInteger b = new BigInteger("1");
while (place-- > 1)
BigInteger t = b;
b = a.add(b);
a = t;
return b;
【讨论】:
对于非常大的斐波那契数,递归计算非常耗时。最好使用Binet's explicit formula。几个 Math.pow()s 和 Math.sqrt()s 之后,你就完成了! :) @ZubinMukerjee 但是 BigDecimal 上的 pow 和 sqrt 也不便宜。它比迭代更好,但并不像听起来那么简单。【参考方案4】:结帐BigDecimal
和BigInteger
。
【讨论】:
【参考方案5】:import java.math.BigInteger;
import java.util.*;
class A
public static void main(String args[])
Scanner in=new Scanner(System.in);
System.out.print("Enter The First Number= ");
String a=in.next();
System.out.print("Enter The Second Number= ");
String b=in.next();
BigInteger obj=new BigInteger(a);
BigInteger obj1=new BigInteger(b);
System.out.println("Sum="+obj.add(obj1));
【讨论】:
【参考方案6】:根据您的工作,您可能想看看 GMP (gmplib.org),它是一个高性能多精度库。要在 Java 中使用它,您需要在二进制库周围使用 JNI 包装器。
有关使用它而不是 BigInteger 将 Pi 计算为任意位数的示例,请参阅 Alioth Shootout 代码。
https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-java-2.html
【讨论】:
以上是关于Java中的大数的主要内容,如果未能解决你的问题,请参考以下文章