600851475143 के लिए "पूर्णांक संख्या बहुत बड़ी" त्रुटि संदेश


89
public class Three {
    public static void main(String[] args) {
        Three obj = new Three();
        obj.function(600851475143);
    }

    private Long function(long  i) {
        Stack<Long> stack = new Stack<Long>();

        for (long j = 2; j <= i; j++) {
            if (i % j == 0) {
                stack.push(j);
            }
        }
        return stack.pop();
    }
}

जब ऊपर कोड चलाया जाता है, तो यह लाइन पर एक त्रुटि पैदा करता है obj.function(600851475143);। क्यों?


1
यह भी "एल" और "एल" के बीच कोई अंतर नहीं है?
user446654

@ user446654: नहीं, वहाँ है। उत्तरार्द्ध अधिक पठनीय है। इसके लिए "Java Puzzler" पढ़ें।
आदिल अंसारी

@ user446654: संभव मेमोरी सीमा के बारे में @ थाइलो विचार विकसित करना जो मैं अपने 2 सिक्कों को जोड़ना चाहता हूं: आपने वास्तव में एक नंबर के सभी डिवाइडर की खोज के लिए वास्तव में खराब एल्गोरिदम चुना है यदि आप अपने उदाहरण में इतनी बड़ी संख्याओं के साथ काम करना चाहते हैं। डायनामिक प्रोग्रामिंग पर आधारित कुछ शायद बेहतर काम करेगा। आगे के परिणामों के लिए उस पर Google
रोमन

1
जोड़ा गया टैग पीई, प्रोजेक्ट यूलर # 3
st0le

@ st0le: IMHO प्रश्न मूल समस्या समाधान के बारे में नहीं है, और जो हम देखते हैं वह समाधान भी नहीं है।
रोमन

जवाबों:


199

60085147514332-बिट पूर्णांक (प्रकार int) के रूप में प्रतिनिधित्व नहीं किया जा सकता है । इसे 64-बिट पूर्णांक (प्रकार long) के रूप में दर्शाया जा सकता है । एक "एल" के साथ जावा अंत में लंबे शाब्दिक:600851475143L


71

संलग्न प्रत्यय L: 23423429L

डिफ़ॉल्ट रूप से, जावा 32-बिट पूर्णांक मान के रूप में सभी अंकीय शाब्दिक व्याख्या करता है। यदि आप स्पष्ट रूप से निर्दिष्ट करना चाहते हैं कि यह कुछ बड़ा है तो 32-बिट पूर्णांक आपको Lलंबे मानों के लिए प्रत्यय का उपयोग करना चाहिए ।


चर प्रकार को बदलने के बाद भी आपको यह त्रुटि संदेश क्यों मिलता है, इस बारे में अधिक गहन खोज करने वालों के लिए long, यह पढ़ें: stackoverflow.com/a/8924925/293280
जोशुआ पिंटर

29

आपको एक लंबे शाब्दिक प्रयोग करने की आवश्यकता है:

obj.function(600851475143l);  // note the "l" at the end

लेकिन मुझे उम्मीद है कि यह समारोह स्मृति (या समय) से बाहर चला जाएगा ...


17
इसे lऊपरी मामला बनाने के लिए एक बेहतर अभ्यास माना जाता है , ताकि यह आसानी से अलग हो सके1
Bozho

2
@ बूझो: सहमत। लेकिन मेरे पास एक पर्ल बैकग्राउंड है। मैं "राइट-ओनली" :-)
थिलो सेप

"एल" के बजाय "एल" का उपयोग करें
केविन वी

13

जावा कम्पाइलर डिफ़ॉल्ट रूप से टाइप इंट के निरंतर मान के रूप में 600851475143 की व्याख्या करने की कोशिश करता है। यह एक त्रुटि का कारण बनता है क्योंकि 600851475143 एक इंट के साथ प्रतिनिधित्व नहीं किया जा सकता है।

संकलक को यह बताने के लिए कि आप संख्या की व्याख्या चाहते हैं, जब तक कि आपको इसके बाद lया Lउसके बाद जोड़ना हो। आपका नंबर इस तरह दिखना चाहिए 600851475143L

चूंकि कुछ फ़ॉन्ट्स एक दूसरे से "1" और निचले मामले "l" को अलग करना मुश्किल बनाते हैं, इसलिए आपको हमेशा ऊपरी मामले "L" का उपयोग करना चाहिए।


6

पूर्णांक शाब्दिक 600851475143 का प्रतिनिधित्व करने के लिए आपको 40 बिट्स की आवश्यकता है। जावा में, अधिकतम पूर्णांक मान 2 ^ 31-1 है (हालांकि पूर्णांक 32 बिट हैं, http://download.oracle.com/javase/1.4.2/cocs देखें) /api/java/lang/Integer.html )।

इससे कोई लेना-देना नहीं है function। इसके बजाय एक लंबे पूर्णांक शाब्दिक का उपयोग करने का प्रयास करें (जैसा कि अन्य उत्तरों में सुझाव दिया गया है)।


4

संकलन समय पर "600851475143" संख्या को 32-बिट पूर्णांक में दर्शाया गया है, इस समस्या से छुटकारा पाने के लिए अपने नंबर के अंत में इसके बजाय लंबे शाब्दिक प्रयास करें।


3

अन्य सभी उत्तरों के अलावा, आप क्या कर सकते हैं:

long l = Long.parseLong("600851475143");

उदाहरण के लिए :

obj.function(Long.parseLong("600851475143"));

1

या, आप इनपुट नंबर को लंबे समय तक घोषित कर सकते हैं, और फिर उसे कोड टैंगो: डी ... करें।

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("Enter a number");
    long n = in.nextLong();

    for (long i = 2; i <= n; i++) {
        while (n % i == 0) {
            System.out.print(", " + i);
            n /= i;
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.