15

How to add two numbers of any length in java?

Say for example, in java long size is 64 bit. So the maximum range is -9223372036854775808 to 9223372036854775807. Am i right?

So if we want to add a number which is greater than this like below, i got a error

" Integer Number too large"

long a = 9223372036854775807L;
long b = 9223372036854775808L;

In C, we can take those numbers as char array, by traversing through the address of each char and use some data structure, we can add two numbers of any size.

How to do it java. Can we traverse through the address of each character in String.


Thanks for your responses.

I have tried to code by passing the numbers as string and add each character from the end. It works fine for me.

Is there any big difference between the addition of two very large numbers using BigInteger and the method, i specified above (add each character from end and store remainder in temporary variable and goes on). Is the underlying mechanism of BigInteger is same as my code(add each character from end)?

Thanks.

Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
Manoj
  • 5,707
  • 19
  • 56
  • 86

8 Answers8

21

You can use a BigInteger.

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

The BigInteger will let you work with numbers of any size, but you lose a considerable amount of performance over long or int.

jjnguy
  • 136,852
  • 53
  • 295
  • 323
7

The BigInteger will let you work with numbers of any size, but you lose a considerable amount of performance over long or int.

Actually, if you just need to run this operation once (user enters two numbers, and gets the result back), using BigInteger is fine. But if you need to perform the addition operation many times, you could use really your own implementation of big integer. When I was competing in ACM matches, we often used our own implementations based on char arrays (in C++). I suggest the following code. It is assumed that there are two arrays of integers, A and B. A[0] and B[0] store the lens of the corresponding numbers. A[i] and B[i] stores the digits themselves. A[1] and B[1] are the least significant digits. Therefore the number 1234 would correspond to such an array: {4,4,3,2,1}.

Now, suppose we want to sum these numbers and store them in array C in the same format. Here is an example of code, that you could use:

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;

That code uses the simple rules of arithmetic addition and should work significantly faster than the BigInteger general implementation. Have fun with using that.

jjnguy
  • 136,852
  • 53
  • 295
  • 323
SPIRiT_1984
  • 2,717
  • 3
  • 29
  • 46
6

Use BigInteger. Here is an example.

Example code (based on above link) -

BigInteger reallyBig1 = new BigInteger("1234567890123456890");
BigInteger reallyBig2 = new BigInteger("2743534343434361234");
reallyBig = reallyBig.add(reallyBig2);
Community
  • 1
  • 1
Gopi
  • 10,073
  • 4
  • 31
  • 45
3

Check out the BigInteger class. It will be able to perform the operations you are looking for on really large numbers.

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

jjnguy
  • 136,852
  • 53
  • 295
  • 323
Sam Day
  • 1,713
  • 9
  • 17
  • Not sure why I was rated down for my answer, given that the link provided is clearly the official java documentation, and all the information on that page is plenty for Manoj to determine how to use BigInteger. – Sam Day Sep 20 '10 at 05:25
  • Of course, it *is* java 1.4.2 documentation, which is pathetically old. (though I did not rate down for this) (though this is why I'm not rating up =) ) – amara Sep 20 '10 at 05:30
  • upvote for being the first with a relevant answer, but 1.4.2 is not really the 'official' documentation since it is quite old... – pstanton Sep 20 '10 at 05:30
  • 1
    I downvoted this answer because you just posted a link. In general, I think that an answer on SO should provide some general information before an Asker makes a jump to a link. – jjnguy Sep 20 '10 at 05:38
  • @Sam, you are welcome. I hate being picky...i'ts just a bad habit. – jjnguy Sep 20 '10 at 22:06
  • The link is dead. – Muhd Oct 20 '16 at 22:55
1

Is there any big difference between the addition of two very large numbers using BigInteger and the method, i specified above (add each character from end and store remainder in temporary variable and goes on).

The difference is that you could use a larger radix, for example. Suppose the radix is 10000, not just 10. When the code of my previous answer would be modified like this:

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;

In that case the code runs 4 time faster (since there is no difference for the virtual machine in arithmetic operations, since they depend on the constant only). Also, this means, that the array of integers will be 4 times smaller. The only problem this causes is how to format the output.

SPIRiT_1984
  • 2,717
  • 3
  • 29
  • 46
1

Create a stack class and get numbers as string from user and convert them into string and push them into stacks. Here I've written the full code for the addition of two large numbers. stack class also included. Just type in cmd javac mystack.java then 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());
    }

}
}
neethan
  • 11
  • 3
1
public class AddNumbers {
    public static void main(String args[]) {
        String a = new String("3999988889999999995555558888999444333333333222229998877666555444888888");
        String b = new String("56867865876989679765465456412332199");
        int loop1 = 0;
        int loop2 = 0;
        StringBuilder sum = new StringBuilder("");
        int carry = 0;
        for (loop1 = a.length() - 1, loop2 = b.length() - 1; loop1 >= 0 || loop2 >= 0; loop1--, loop2--) {
            int indiv1 = 0;
            if (loop1 >= 0)
                indiv1 = Integer.parseInt("" + a.charAt(loop1));
            int indiv2 = 0;
            if (loop2 >= 0)
                indiv2 = Integer.parseInt("" + b.charAt(loop2));
            int summation = indiv1 + indiv2 + carry;
            double d = Math.floor(summation / 10);
            carry = (int) d;
            int sum2 = summation % 10;
            sum.append(sum2);
        }
        System.out.println(sum.reverse());
    }
}
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

import java.math.BigInteger will let you work with numbers of any size,

Keshav Gera
  • 10,807
  • 1
  • 75
  • 53