2010-09-20 8 views
11

जावा में किसी भी लंबाई की दो संख्याओं को जोड़ने के लिए कैसे?जावा में किसी भी लंबाई की दो संख्याओं को कैसे जोड़ा जाए?

उदाहरण के लिए कहें, जावा लंबे आकार में 64 बिट है। तो अधिकतम सीमा -9223372036854775808 से 9223372036854775807 है। क्या मैं सही हूँ?

तो हम एक संख्या है, जो नीचे की तरह इस से अधिक है जोड़ना चाहते हैं, मैं एक त्रुटि

"पूर्णांक संख्या बहुत बड़ी है"

लंबे समय से एक = 9223372036854775807L मिला,
लांग बी = 9 223372036854775808 एल;

सी में, हम उन संख्याओं को चार सर के पते के माध्यम से घुमाकर और कुछ डेटा संरचना का उपयोग करके चार सरणी के रूप में ले सकते हैं, हम किसी भी आकार के दो नंबर जोड़ सकते हैं।

जावा कैसे करें। क्या हम स्ट्रिंग में प्रत्येक चरित्र के पते के माध्यम से जा सकते हैं।


आपके प्रतिक्रियाओं के लिए धन्यवाद।

मैंने संख्याओं को स्ट्रिंग के रूप में पास करके कोड को चलाने की कोशिश की है और प्रत्येक चरित्र को अंत से जोड़ दिया है। यह मेरे लिए ठीक काम करता है।

बिगइंटर और विधि का उपयोग करके दो बहुत बड़ी संख्याओं के अतिरिक्त के बीच कोई बड़ा अंतर है, मैंने ऊपर निर्दिष्ट किया है (प्रत्येक वर्ण को अंत से जोड़ें और अस्थायी चर में शेष संग्रह करें और आगे बढ़ें)। क्या BigInteger का अंतर्निहित तंत्र मेरे कोड के समान है (प्रत्येक चरित्र को अंत से जोड़ें)?

धन्यवाद।

+0

सी में, हम भी इस्तेमाल कर सकते हैं जीएमपी (http://gmplib.org/) – SingleNegationElimination

उत्तर

3

BigInteger कक्षा देखें। यह उन परिचालनों को निष्पादित करने में सक्षम होगा जो आप वास्तव में बड़ी संख्या में खोज रहे हैं।

http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html

+0

जैसे मनमाने ढंग से सटीक पूर्णांक के लिए एक पूर्ववर्ती लाइब्रेरी, मुझे यकीन नहीं है कि मुझे मेरे उत्तर के लिए क्यों रेट किया गया था, बशर्ते कि प्रदान किया गया लिंक स्पष्ट रूप से आधिकारिक जावा दस्तावेज है, और उस पर सभी जानकारी Manoj के लिए पेज बिगइंटर का उपयोग करने का तरीका निर्धारित करने के लिए बहुत कुछ है। –

+0

बेशक, यह * जावा 1.4.2 दस्तावेज है, जो पेटी से पुराना है। (हालांकि मैंने इसके लिए रेट नहीं किया) (हालांकि इसीलिए मैं रेटिंग नहीं कर रहा हूं =)) – naiad

+0

प्रासंगिक उत्तर के साथ पहले होने के लिए अपवोट, लेकिन 1.4.2 वास्तव में 'आधिकारिक' दस्तावेज नहीं है क्योंकि यह है काफी पुराना ... – pstanton

6

उपयोग BigIntegerHere एक उदाहरण है।

उदाहरण कोड (ऊपर के लिंक पर आधारित) -

BigInteger reallyBig1 = new BigInteger("123456789"); 
BigInteger reallyBig2 = new BigInteger("2743534343434361234"); 
reallyBig = reallyBig.add(reallyBig2); 
+1

उम्म, संख्या में अक्षर क्यों हैं? – jjnguy

+0

@ जस्टिन :) टाइपो यादृच्छिक कुंजी दबाकर बड़ी संख्या बनाने के प्रयास में। इस पर ध्यान दिलाने के लिए धन्यवाद। अच्छा अवलोकन! ठीक कर दिया। – Gopi

+0

हो सकता है कि आप दूसरी बिगइंटर वास्तव में बीआईजी 2 = नया बिगइंटर ("27435dfdsafasd61234", 32) होने का मतलब हो; '। – MAK

19

आप एक BigInteger उपयोग कर सकते हैं।

BigInteger a = new BigInteger("9223372036854775807"); 
BigInteger b = new BigInteger("9223372036854775808"); 
BigInteger result = a.add(b); 

BigInteger आप किसी भी आकार के संख्या के साथ काम करते हैं, लेकिन आप long या int पर प्रदर्शन की एक पर्याप्त राशि खो देंगे।

4

BigInteger आप किसी भी आकार के संख्या के साथ काम करते हैं, लेकिन आप long या int पर प्रदर्शन की एक पर्याप्त राशि खो देंगे।

दरअसल, यदि आपको केवल एक बार ऑपरेशन चलाने की आवश्यकता है (उपयोगकर्ता दो नंबर दर्ज करता है, और परिणाम वापस प्राप्त करता है), BigInteger का उपयोग ठीक है।लेकिन अगर आपको अतिरिक्त ऑपरेशन कई बार करने की ज़रूरत है, तो आप वास्तव में बड़े पूर्णांक के अपने कार्यान्वयन का उपयोग कर सकते हैं। जब मैं एसीएम मैचों में प्रतिस्पर्धा कर रहा था, तो हम अक्सर चार सरणी (सी ++ में) के आधार पर अपने स्वयं के कार्यान्वयन का इस्तेमाल करते थे। मैं निम्नलिखित कोड का सुझाव देता हूं। यह पूर्णांकों, एक की दो सरणियों देखते हैं कि माना जाता है और बी एक [0] और बी [0] दुकान इसी संख्या के लेंस। एक [i] और बी [i] भंडार अंक खुद को। एक [1] और बी [1] कम से कम महत्वपूर्ण अंक हैं। इसलिए संख्या 1234 ऐसी सरणी से मेल खाती है: {4,4,3,2,1}।

अब, हम इन नंबरों योग और उसी प्रारूप में सरणी सी में उन्हें स्टोर करने के लिए चाहते हैं। यहाँ कोड का एक उदाहरण है, कि आप इस्तेमाल कर सकते हैं:

int len1 = A[0], len2 = B[0], divisor = 0; 
int len = len1 >= len2 ? len1 : len2; 
for (int i=1;i<=len;i++) { 
    if (i>len1) C[i] = B[i]+divisor; 
    else if (i>len2) C[i] = A[i]+divisor; 
    else C[i] = A[i]+B[i]+divisor; 
    divisor = C[i]/10; 
    C[i] %= 10; 
} 
while (divisor>0) { 
    C[++len] = divisor%10; 
    divisor /= 10; 
} 
C[0] = len; 

कि कोड गणित इसके अलावा के सरल नियमों का उपयोग करता है और BigInteger सामान्य कार्यान्वयन की तुलना में काफी तेजी से काम करना चाहिए। इसका उपयोग करने में मजा करो।

+0

मुझे उद्धृत किया जा रहा है! हे, अच्छा जवाब। – jjnguy

1

बिगइंटर और विधि का उपयोग करके दो बहुत बड़ी संख्याओं के अतिरिक्त के बीच कोई बड़ा अंतर है, मैंने ऊपर निर्दिष्ट किया है (प्रत्येक चरित्र को अंत से जोड़ें और अस्थायी चर में शेष संग्रह करें और आगे बढ़ें)।

अंतर यह है कि आप एक बड़े रेडिक्स का उपयोग कर सकते हैं, उदाहरण के लिए। मान लीजिए मूलांक 10000 है, बस 10 मेरे पिछले जवाब का कोड इस तरह संशोधित किया जाएगा जब नहीं:

int len1 = A[0], len2 = B[0], divisor = 0; 
int len = len1 >= len2 ? len1 : len2; 

for (int i=1;i<=len;i++) { 
    if (i>len1) C[i] = B[i]+divisor; 
    else if (i>len2) C[i] = A[i]+divisor; 
    else C[i] = A[i]+B[i]+divisor; 
    divisor = C[i]/10000; 
    C[i] %= 10000; 
} 
while (divisor>0) { 
    C[++len] = divisor%10000; 
    divisor /= 10000; 
} 
C[0] = len; 

उस मामले में कोड 4 समय तेजी से चलाता है (के बाद से वहाँ में आभासी मशीन के लिए कोई अंतर नहीं है अंकगणितीय परिचालन, क्योंकि वे केवल स्थिर पर निर्भर करते हैं)। इसके अलावा, इसका मतलब है कि पूर्णांक की सरणी 4 गुना छोटी होगी। आउटपुट को प्रारूपित करने का यह एकमात्र समस्या है।

1

ढेर कक्षा बनाएं और उपयोगकर्ता से स्ट्रिंग के रूप में संख्या और उन्हें स्ट्रिंग में तब्दील करने और उन्हें ढेर में धक्का। यहां मैंने दो बड़ी संख्याओं के अतिरिक्त के लिए पूर्ण कोड लिखा है। ढेर वर्ग भी शामिल है। cmd javac mystack.java तो जावा mystack में बस प्रकार

import java.util.*; 
public class mystack { 
int maxsize=0; 
int top=-1; 
int array []=new int [0]; 


public mystack (int size) 
{ 
    maxsize=size; 
    array=new int [maxsize]; 
} 

public void push (int x) 
{ 
    top=top+1; 
    array[top]=x; 
} 

public int pop() 
{ 
    int elt=array[top]; 
    top--; 
    return elt; 

} 

public boolean stackisfull() 
{ 
    return(top==maxsize-1); 
} 

public boolean stackisempty() 
{ 
    return(top==-1); 
} 

public int peak() 
{ 
    int peak =array[top]; 
    return peak; 
} 

public static void main (String args[]){ 
Scanner in=new Scanner (System.in); 

System.out.println("Enter the 1st number"); 
String number1 = in.nextLine(); 
System.out.println(); 
System.out.println("Enter the 2nd number"); 
String number2 = in.nextLine(); 
System.out.println(); 

String temp=""; 




if(number1.length()>number2.length()) 
{ 
    temp=number1; 
    number1=number2; 
    number2=temp; 
} 

    int k=0; 


mystack S1 = new mystack (number1.length()); 

     for(int i=0;i<number1.length();i++) 
     { 
      String str=Character.toString(number1.charAt(i)); 
      S1.push(Integer.parseInt(str)); 
     } 

mystack S2 = new mystack (number2.length()); 

    for(int i=0;i<number2.length();i++) 
     { 
      String str=Character.toString(number2.charAt(i)); 
      S2.push(Integer.parseInt(str)); 
     } 

mystack S3 =new mystack (number2.length()); 

while(!S1.stackisempty()) 
{ 
    int x=S1.pop(); 
    int y=S2.pop(); 

    int times=(x+y+k)/10; int remainder =(x+y+k)%10; 
    k=0; 

    if(times==0) 
    { 
     S3.push(remainder); 
    } 

    else 
    { 
     S3.push(remainder); 
     k=1; 
    } 
} 
    while(!S2.stackisempty()) 
    { 
     if(k==1) 
     { 
      S3.push(k+S2.pop()); 
      k=0; 
     } 
     else 
     S3.push(S2.pop()); 
    } 

    System.out.print("Addition is "); 

    while(!S3.stackisempty()) 
    { 
     System.out.print(S3.pop()); 
    } 

} 
} 
0
import java.math.BigInteger; 
    import java.util.Scanner; 

    public class BigIntergerSumExample { 

     public static void main(String args[]) { 

      BigInteger number1; 
      BigInteger number2; 
      BigInteger sum; 
      Scanner sc = new Scanner(System.in); 
      System.out.println("Enter the value of number 1"); 
      number1 = sc.nextBigInteger(); 
      System.out.println("Enter the value of number 2"); 
      number2 = sc.nextBigInteger(); 


      BigInteger a = new BigInteger(""+number1); 
      BigInteger b = new BigInteger(""+number2); 
      BigInteger result = a.add(b); 

      System.out.println("Sum is Two numbers : -> " + result); 
     } 

    } 

**OUTPUT IS** 

Enter the value of number 1 
1111111111111111111111111111111111111111111111111 
Enter the value of number 2 
2222222222222222222222222222222222222222222222222 
Sum is Two numbers : -> 
3333333333333333333333333333333333333333333333333 

आयात java.math.BigInteger आप किसी भी आकार के संख्या के साथ काम करने देगा,

+0

आयात java.math.BigInteger आयात करें –

संबंधित मुद्दे