Javaで多数


93

Javaで非常に大きな数値を使用して計算するにはどうすればよいですか?

私は試しましたlongが、最大値は9223372036854775807です。整数を使用すると、十分な桁数が保存されないため、必要な精度が不十分です。

とにかくこれの周りにありますか?


3
9223372036854775807Long.MAX_VALUEとにかく、の正確な値です。
ジンクォン

回答:


153

このBigIntegerクラスは、整数およびBigDecimal10進数の数値に使用できます。どちらのクラスもjava.mathパッケージで定義されています。

例:

BigInteger reallyBig = new BigInteger("1234567890123456890");
BigInteger notSoBig = new BigInteger("2743561234");
reallyBig = reallyBig.add(notSoBig);

8
これを使用して計算を行う場合は、BigIntegerクラスの使用によって発生するパフォーマンスヒット(ほとんどの場合は明らかですが)が継承するパフォーマンスヒットに言及する価値があります。
ヘイレム2012

@haylemのパフォーマンス速度は同じですが、数値が長いため時間がかかります。彼らは計算を行うためにビットごとの演算子を使用します。プリミティブ型を使って数学をするときに通常何が起こるか。
ZOLDIK


18

これは非常に迅速に大きな数を取得する例です。

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;
    }
}

1
本当に大きなフィボナッチ数の場合、再帰的な計算は途方もなく時間がかかります。Binetの明示的な式を使用する方がはるかに優れています。いくつかのMath.pow()sとMath.sqrt()sの後で、完了です。:)
Zubin Mukerjee 2016年

1
@ZubinMukerjeeただし、BigDecimalのpowとsqrtも安くはありません。反復よりは優れていますが、思ったほど単純ではありません。
Peter Lawrey、2016年


6
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));
    }
}

3

何をしているのかに応じて、高性能の多精度ライブラリであるGMP(gmplib.org)をご覧ください。Javaで使用するには、バイナリライブラリの周りにJNIラッパーが必要です。

BigIntegerの代わりにそれを使用してPiを任意の桁数に計算する例については、Alioth Shootoutコードの一部を参照してください。

https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-java-2.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.