Как добавить два числа любой длины в Java?

Как добавить два числа любой длины в Java?

Скажем, например, в Java длинный размер составляет 64 бит. Таким образом, максимальный диапазон составляет от -9223372036854775808 до 9223372036854775807. Я прав?

Так что, если мы хотим добавить число, которое больше, чем это, как показано ниже, я получил ошибку

«Слишком большое целое число»

длинный а = 9223372036854775807L;
длинный b = 9223372036854775808L;

В C мы можем принять эти числа в виде массива символов, пройдя через адрес каждого символа и используя некоторую структуру данных, мы можем добавить два числа любого размера.

Как это сделать Java. Можем ли мы пройти через адрес каждого символа в строке.

Спасибо за ваши ответы.

Я попытался кодировать, передавая числа в виде строки и добавить каждый символ в конце. Он отлично работает для меня.

Есть ли большая разница между добавлением двух очень больших чисел с использованием BigInteger и метода, который я указал выше (добавьте каждый символ из конца и сохраните остаток во временной переменной и продолжите). Является ли основной механизм BigInteger такой же, как мой код (добавить каждый символ с конца)?

Благодарю.

 SingleNegationElimination20 сент. 2010 г., 08:23
В C мы могли бы также использовать существующую библиотеку для целых чисел произвольной точности, например GMP (gmplib.org)

Ответы на вопрос(7)

преобразуйте их в строку и поместите в стеки. Здесь я написал полный код для добавления двух больших чисел. класс стека также включен. Просто введите cmd javac mystack.java, затем 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());
    }

}
}

спользованием BigInteger и метода, который я указал выше (добавьте каждый символ из конца и сохраните остаток во временной переменной и продолжите).

Разница в том, что вы можете использовать больший радиус, например. Предположим, что основание составляет 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 раза меньше. Единственная проблема, которую это вызывает, - как отформатировать вывод.

BigInteger позволит вам работать с числами любого размера, но вы потеряете значительное количество производительности по сравнению сlong или жеint.

На самом деле, если вам просто нужно запустить эту операцию один раз (пользователь вводит два числа и возвращает результат), используяBigInteger Это хорошо. Но если вам нужно многократно выполнять операцию сложения, вы можете использовать собственную реализацию большого целого числа. Когда я участвовал в матчах ACM, мы часто использовали наши собственные реализации, основанные на массивах символов (в C ++). Я предлагаю следующий код. Предполагается, что есть два массива целых чисел, A и B.А [0] а такжеВ [0] хранить линзы соответствующих номеров.А [я] а такжеВ [я] хранит цифры сами.А [1] а такжеВ [1] наименее значимые цифры. Следовательно, число 1234 будет соответствовать такому массиву: {4,4,3,2,1}.

Теперь предположим, что мы хотим сложить эти числа и сохранить их в массиве C в том же формате. Вот пример кода, который вы можете использовать:

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 общая реализация. Удачи с этим.

 jjnguy20 сент. 2010 г., 15:09
Меня цитируют! Хе-хе, хороший ответ.
    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 позволит вам работать с числами любого размера,

 Keshav Gera09 июн. 2017 г., 07:58
импорт java.math.BigInteger

Вы можете использоватьBigInteger.

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

BigInteger позволит вам работать с числами любого размера, но вы потеряете значительное количество производительности по сравнению сlong или жеint.

BigInteger учебный класс. Он сможет выполнять операции, которые вы ищете на действительно больших количествах.

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

 Muhd21 окт. 2016 г., 00:55
Ссылка мертва.
 jjnguy20 сент. 2010 г., 15:52
Добавил некоторый контент и убрал мое downvote.
 Sam Day21 сент. 2010 г., 00:05
@Justin: спасибо :)
 pstanton20 сент. 2010 г., 07:30
upvote за то, что был первым с соответствующим ответом, но 1.4.2 на самом деле не является «официальной» документацией, поскольку она довольно старая…
 jjnguy20 сент. 2010 г., 07:38
Я отклонил этот ответ, потому что вы только что опубликовали ссылку. В общем, я думаю, что ответ на SO должен предоставить некоторую общую информацию, прежде чем Аскер сделает переход по ссылке.
 amara20 сент. 2010 г., 07:30
Конечно, этоявляется Документация Java 1.4.2, которая является патетически старой. (хотя я не оценил это вниз) (хотя именно поэтому я не повышаю рейтинг =))
 Sam Day20 сент. 2010 г., 07:25
Не уверен, почему меня понизили за мой ответ, учитывая, что предоставленная ссылка явно является официальной документацией java, и вся информация на этой странице достаточна для того, чтобы Маной определил, как использовать BigInteger.
 Sean Patrick Floyd20 сент. 2010 г., 08:58
ну может один или два человека здесь умнее гугла ...
 poke20 сент. 2010 г., 08:20
1.4.2 по-прежнему первый результат в Google <_ <
 jjnguy21 сент. 2010 г., 00:06
@ Сэм, пожалуйста. Я ненавижу быть разборчивым ... это просто плохая привычка.

BigInteger. Вот это пример.

Пример кода (на основе ссылки выше) -

BigInteger reallyBig1 = new BigInteger("1234567890123456890");
BigInteger reallyBig2 = new BigInteger("2743534343434361234");
reallyBig = reallyBig.add(reallyBig2);
 jjnguy20 сент. 2010 г., 07:36
А, ну ладно. Не был уверен, что ты хотел этого.
 jjnguy20 сент. 2010 г., 07:24
Хм, почему в номере буквы?
 Gopi20 сент. 2010 г., 07:32
@Justin :) опечатка в попытке создать большие числа нажатием случайных клавиш. Спасибо за указание на это. Хорошее наблюдение! исправленный.
 MAK20 сент. 2010 г., 07:33
Может быть, вы имели в виду вторую строкуBigInteger reallyBig2 = new BigInteger("27435dfdsafasd61234",32);.

Ваш ответ на вопрос