Великі числа в Java


93

Як я можу робити обчислення з надзвичайно великими числами на Java?

Я спробував, longале це максимум на 9223372036854775807, і при використанні цілого числа він не економить достатньо цифр і тому недостатньо точний для того, що мені потрібно.

Чи є все-таки навколо цього?


3
9223372036854775807в Long.MAX_VALUEбудь-якому випадку є точним значенням .
Джин Квон,

Відповіді:


153

Ви можете використовувати BigIntegerклас для цілих чисел і BigDecimalдля чисел з десятковими цифрами. Обидва класи визначені в java.mathпакеті.

Приклад:

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

8
Можливо, варто згадати про (хоч і очевидний для більшості, я думаю,) успадкований хіт продуктивності, який виникає при використанні класу BigInteger, якщо ви плануєте робити обчислення з цим.
haylem

@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
Для справді великих чисел Фібоначчі рекурсивне обчислення смішно займає багато часу. Набагато краще використовувати явну формулу Біне . Кілька Math.pow () і Math.sqrt () пізніше, ви готові! :)
Zubin Mukerjee

1
@ZubinMukerjee, проте pow і sqrt на BigDecimal теж не дешеві. Це краще, ніж ітерація, але не так просто, як це звучить.
Пітер Лорі


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 навколо бінарної бібліотеки.

Див. Деякий код Alioth Shootout для прикладу використання його замість BigInteger для обчислення Pi до довільної кількості цифр.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.