Как добавить два числа любой длины в Java?
28144 просмотра
7 ответа
Как добавить два числа любой длины в Java?
Скажем, например, в Java длинный размер составляет 64 бит. Таким образом, максимальный диапазон составляет от -9223372036854775808 до 9223372036854775807. Я прав?
Так что, если мы хотим добавить число, которое больше, чем это, как показано ниже, я получил ошибку
«Слишком большое целое число»
длинный а = 9223372036854775807L;
длинный b = 9223372036854775808L;
В C мы можем принять эти числа в виде массива символов, пройдя через адрес каждого символа и используя некоторую структуру данных, мы можем добавить два числа любого размера.
Как это сделать Java. Можем ли мы пройти через адрес каждого символа в строке.
Спасибо за ваши ответы.
Я попытался кодировать, передавая числа в виде строки и добавить каждый символ в конце. Он отлично работает для меня.
Есть ли большая разница между добавлением двух очень больших чисел с использованием BigInteger и метода, который я указал выше (добавьте каждый символ из конца и сохраните остаток во временной переменной и продолжите). Является ли основной механизм BigInteger такой же, как мой код (добавить каждый символ с конца)?
Благодарю.
Автор: Manoj Источник Размещён: 12.11.2019 09:15Ответы (7)
20 плюса
Вы можете использовать BigInteger
.
BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = new BigInteger("9223372036854775808");
BigInteger result = a.add(b);
Это BigInteger
позволит вам работать с числами любого размера, но вы потеряете значительную производительность по сравнению с long
или int
.
6 плюса
Используйте BigInteger . Вот пример.
Пример кода (на основе ссылки выше) -
BigInteger reallyBig1 = new BigInteger("1234567890123456890");
BigInteger reallyBig2 = new BigInteger("2743534343434361234");
reallyBig = reallyBig.add(reallyBig2);
Автор: Gopi
Размещён: 20.09.2010 05:16
6 плюса
Это
BigInteger
позволит вам работать с числами любого размера, но вы потеряете значительную производительность по сравнению сlong
илиint
.
На самом деле, если вам просто нужно запустить эту операцию один раз (пользователь вводит два числа и возвращает результат), использование BigInteger
в порядке. Но если вам нужно многократно выполнять операцию сложения, вы можете использовать собственную реализацию большого целого числа. Когда я участвовал в матчах ACM, мы часто использовали наши собственные реализации, основанные на массивах символов (в C ++). Я предлагаю следующий код. Предполагается, что существует два массива целых чисел, A и B. A [0] и B [0] хранят линзы соответствующих чисел. A [i] и B [i] хранят сами цифры. A [1] и B [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
общая реализация. Удачи с этим.
3 плюса
Проверьте BigInteger
класс. Он сможет выполнять операции, которые вы ищете на действительно больших количествах.
http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html
Автор: Sam Day Размещён: 20.09.2010 05:141 плюс
Есть ли большая разница между добавлением двух очень больших чисел с использованием 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 раза меньше. Единственная проблема, которую это вызывает, - как отформатировать вывод.
Автор: SPIRiT_1984 Размещён: 20.09.2010 10:121 плюс
Создайте класс стека и получите числа в виде строки от пользователя, преобразуйте их в строку и поместите в стеки. Здесь я написал полный код для добавления двух больших чисел. класс стека также включен. Просто введите 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());
}
}
}
Автор: neethan
Размещён: 18.02.2017 04:38
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 позволит вам работать с числами любого размера,
Автор: Keshav Gera Размещён: 09.06.2017 05:43Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- math Головоломка: Найти самый большой прямоугольник (проблема максимального прямоугольника)
- math Алгоритм нахождения наибольшего простого множителя числа
- math Рассчитать расстояние между двумя точками широты и долготы? (Формула Haversine)
- math Каков стандартный способ добавить N секунд для datetime.time в Python?
- math Наиболее эффективный способ реализации целочисленной степенной функции pow (int, int)
- biginteger Большие целые числа в C #
- biginteger Как реализовать большой int в C ++
- biginteger работа с невероятно большими числами в .NET
- biginteger Большие числа в Java
- biginteger Как использовать BigInteger?
- biginteger Лучшая кроссплатформенная (портативная) математическая библиотека произвольной точности