Java中的大数

Posted

技术标签:

【中文标题】Java中的大数【英文标题】:Large Numbers in Java 【发布时间】:2010-10-25 09:20:54 【问题描述】:

如何在 Java 中进行非常大的数字计算?

我已经尝试过long,但它的最大值为 9223372036854775807,当使用整数时,它不能保存足够的数字,因此对于我的需要来说不够准确。

还有这个问题吗?

【问题讨论】:

9223372036854775807Long.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】:

结帐BigDecimalBigInteger

【讨论】:

【参考方案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中的大数的主要内容,如果未能解决你的问题,请参考以下文章

java核心技术卷I中的细节(2- 大数)

Java中的大数处理类BigInteger和BigDecimar浅析

C ++中的大数字库[关闭]

JAVA中大数经常使用的函数

Java中的经典算法之冒泡排序(Bubble Sort)

Java实现大数加法运算的几种方法