Java'da Büyük Sayılar


95

Java'da çok büyük sayılarla nasıl hesaplamalar yapabilirim?

Denedim longama bu 9223372036854775807'de maksimuma çıkıyor ve bir tamsayı kullanırken yeterli basamak kaydetmiyor ve bu nedenle ihtiyacım olan şey için yeterince doğru değil.

Bunun etrafında yine de var mı?


3
9223372036854775807her halükarda tam değeridir Long.MAX_VALUE.
Jin Kwon

Yanıtlar:


154

BigIntegerSınıfı tamsayılar ve BigDecimalondalık basamaklı sayılar için kullanabilirsiniz . Her iki sınıf da java.mathpakette tanımlanmıştır .

Misal:

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

8
Bununla hesaplamalar yapmayı planlıyorsanız, (çoğu için açık olsa da), BigInteger sınıfının kullanımından kaynaklanan miras performans vuruşundan bahsetmeye değer olabilir.
haylem

@haylem performans hızı aynıdır ancak sayının uzunluğu zaman almasını sağlar. hesaplamaları yapmak için bitsel operatörler kullanırlar. ilkel türlerle matematik yaparken normal olan şey gibi.
Eboubaker


18

İşte büyük sayıları çok çabuk alan bir örnek.

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
Gerçekten büyük Fibonacci sayıları için, yinelemeli hesaplama gülünç derecede zaman alıcıdır. Binet'in açık formülünü kullanmak çok daha iyi . Birkaç Math.pow () ve Math.sqrt () sonra bitirdiniz! :)
Zubin Mukerjee

2
@ZubinMukerjee ancak BigDecimal'daki güç ve sqrt de ucuz değil. Yinelemeden daha iyidir, ancak göründüğü kadar basit değildir.
Peter Lawrey


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.