जावा में बड़ी संख्या


93

मैं जावा में बहुत बड़ी संख्या के साथ गणना करने के बारे में कैसे जाऊँगा?

मैंने कोशिश की है, longलेकिन यह अधिकतम 9223372036854747807 पर है, और पूर्णांक का उपयोग करते समय यह पर्याप्त अंकों को नहीं बचाता है और इसलिए मेरी आवश्यकता के लिए पर्याप्त सटीक नहीं है।

क्या इसके आसपास भी ऐसा है?


3
9223372036854775807Long.MAX_VALUEवैसे भी, का सटीक मूल्य है
जिन क्वॉन

जवाबों:


153

आप BigIntegerपूर्णांक के लिए और BigDecimalदशमलव अंकों के साथ संख्याओं के लिए वर्ग का उपयोग कर सकते हैं । दोनों वर्गों को java.mathपैकेज में परिभाषित किया गया है।

उदाहरण:

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

8
यदि आप उस के साथ गणना करने की योजना बनाते हैं तो बिगइंटरेगर वर्ग के उपयोग से होने वाले प्रदर्शन को हिट करने के लिए (हालांकि, मुझे लगता है कि ज्यादातर के लिए स्पष्ट है), उल्लेख के लायक हो सकता है।
हेयर स्टाइल

@haylem की प्रदर्शन गति समान है लेकिन संख्या की लंबाई में समय लगता है। वे गणना करने के लिए बिटवाइज़ ऑपरेटरों का उपयोग करते हैं। जैसे कि आदिम प्रकार से गणित करते समय सामान्य रूप से क्या होता है।
ज़ोल्डिक


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 () s और Math.sqrt () बाद में, आप कर रहे हैं! :)
जुबिन मुखर्जी

1
@ZubinMukerjee हालांकि BigDecimal पर पाउ ​​और sqrt सस्ता भी नहीं है। यह पुनरावृत्ति से बेहतर है लेकिन उतना सरल नहीं है जितना यह लगता है।
पीटर लॉरी


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) पर एक नज़र डाल सकते हैं, जो एक उच्च-प्रदर्शन बहु-सटीक पुस्तकालय है। जावा में इसका उपयोग करने के लिए आपको बाइनरी लाइब्रेरी के चारों ओर जेएनआई रैपर की आवश्यकता होती है।

पाई के अंकों की एक मनमानी संख्या की गणना करने के लिए BigInteger के बजाय इसका उपयोग करने के उदाहरण के लिए कुछ Alioth गोलीबारी कोड देखें।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.