BigInteger का उपयोग कैसे करें?


153

मेरे पास यह कोड है, जो काम नहीं कर रहा है:

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum.add(BigInteger.valueOf(i));
    }
}

योग चर हमेशा 0. मैं गलत क्या कर रहा हूँ?


वैसे, योग आसानी से फिट होना चाहिए int, इसलिए आपको BigIntegerइस उदाहरण की आवश्यकता नहीं है ।
नॉट

8
नहीं, मैंने कोड बदल दिया है। संख्या 5000 से बड़ी है।
cc।

सवाल डुप्लीकेट के रूप में जुड़े हुए इस सवाल के रूप में ही समस्या है प्रतीत नहीं होता है (लिंक किए गए सवाल यह है कि के बारे में जो प्रयोग इतना BigInteger जोड़ा जा सकता है करने के लिए समारोह, यह एक के बारे में है कि कैसे ऐड समारोह का उपयोग करने के)
justhalf

जवाबों:


203

BigIntegerअपरिवर्तनीय है। Javadocs में कहा गया है कि () "[r] एक बिगइंटर बनाता है जिसका मूल्य (यह + वैल) है।" इसलिए, आप बदल नहीं सकते हैं sum, आपको चर के addतरीके के परिणाम को फिर से असाइन करने की आवश्यकता है sum

sum = sum.add(BigInteger.valueOf(i));

1
int तब तक पर्याप्त होगा जब तक आप 2 ^ 31-1 से अधिक नहीं हो जाते, जब तक आप 2 ^ 63-1 से अधिक नहीं जाते तब तक पर्याप्त होगा।
16:35 पर जीन होमिनल

2
जो, उनके उदाहरण में, वह नहीं होगा।
मार्क पॉवेल

105
लेकिन क्या वास्तव में यह सोचना मुश्किल है कि उन्होंने अपने उदाहरण को सरल बना दिया कि वास्तव में समस्या क्या है?
thecoshman

@thecoshman - आप काफी हद तक सही हैं और आपके कमेंट पर अपवोट की संख्या इस तरह के सवालों के सभी पाठकों के लिए समझदारी भरी सलाह है। कुछ और बुद्धिमान सलाह "है पढ़ा कि दूसरों का जवाब दे या टिप्पणी से पहले लिखा था। " इस मामले में उदाहरण के लिए तो यह और भी आवश्यकता नहीं है किसी भी सोचा के बाद से ओपी स्पष्ट रूप से कहा है कि वह सिर्फ इतना है कि प्रश्न नीचे टिप्पणी में: " नहीं, मैं कोड को बदल दिया गया। यह संख्या 5000 से बड़ी है। "
OMY

58
sum = sum.add(BigInteger.valueOf(i))

BigIntegerवर्ग अपरिवर्तनीय है, इसलिए आप अपने राज्य को बदल नहीं सकते। इसलिए "जोड़ने" को कॉल BigIntegerकरना वर्तमान को संशोधित करने के बजाय एक नया बनाता है ।


22

अन्य उत्तरों ने इसे रद्द कर दिया है; BigInteger अपरिवर्तनीय है। यहाँ उस कोड को काम करने के लिए मामूली बदलाव किया गया है।

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum = sum.add(BigInteger.valueOf(i));
    }
}

11

BigInteger एक अपरिवर्तनीय वर्ग है। इसलिए जब भी आप कोई अंकगणित करते हैं, तो आपको आउटपुट को एक चर पर फिर से असाइन करना होगा।


11

java.math.BigIntegerएक अपरिवर्तनीय वर्ग है, इसलिए हम पहले से असाइन किए गए ऑब्जेक्ट के स्थान पर नई ऑब्जेक्ट असाइन नहीं कर सकते हैं। लेकिन आप नए मान प्रदान करने के लिए नई वस्तु बना सकते हैं जैसे:

sum = sum.add(BigInteger.valueOf(i));

3

हाँ, यह अपरिवर्तनीय है

sum.add(BigInteger.valueOf(i));

इसलिए BigInteger वर्ग का मेथड ऐड () अपने स्वयं के मूल्य में नया BigIntger वैल्यू नहीं जोड़ता है, लेकिन वर्तमान BigInteger को बदले बिना एक नया BigInteger संदर्भ बनाता है और लौटाता है और स्ट्रिंग्स के मामले में भी ऐसा ही होता है


0

वास्तव में आप उपयोग कर सकते हैं,

BigInteger sum= new BigInteger("12345");

BigInteger class के लिए ऑब्जेक्ट बनाने के लिए। लेकिन यहाँ समस्या यह है कि, आप दोहरे कोट्स में एक वैरिएबल नहीं दे सकते हैं। तो हमें valueOf () विधि का उपयोग करना होगा और हमें उस योग में उत्तर को फिर से स्टोर करना होगा। इसलिए हम लिखेंगे,

sum= sum.add(BigInteger.valueOf(i));

0

Bigintegerएक अपरिवर्तनीय वर्ग है। आपको अपने आउटपुट के मूल्य को इस तरह स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है:

sum = sum.add(BigInteger.valueof(i));    

4
यह अब उसी स्पष्टीकरण के साथ 8 वां उत्तर है, तो यह उत्तर सहायक कैसे है?
टॉम

-6

चूंकि आप कुछ अंतर मानों को एक साथ जोड़ रहे हैं, इसलिए बिगइंटर का उपयोग करने की कोई आवश्यकता नहीं है। longउसके लिए पर्याप्त है। int32 बिट्स है, जबकि long64 बिट्स है, जिसमें सभी इंट वैल्यू का योग हो सकता है।


"लेकिन क्या वास्तव में यह सोचना मुश्किल है कि शायद उन्होंने अपने उदाहरण को सरल बना दिया कि वास्तव में समस्या क्या है?" (कोटिशमन के हवाले से)
बुल्लेसर

5
इस सवाल के लिए, मेरा जवाब हमारे दायरे का एक सा है। चूंकि विषय BigInteger का उपयोग करने के तरीके पर ध्यान केंद्रित करता है। मेरे व्यक्तिगत अनुभव में से सिर्फ एक, अगर हम कुछ पूर्णांकों को जोड़ना चाहते हैं और संख्या बहुत बड़ी नहीं है, तो मैं लंबे समय तक पसंद करूंगा। क्योंकि यह प्रयोग करने में आसान है और तेजी से चलता है। बड़े पैमाने पर इनपुट के लिए, BigInteger अच्छा विकल्प है।
फ्रैंक.लिउ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.