Сумма двух огромных длин на Яве - PullRequest
0 голосов
/ 03 мая 2018

Я написал этот метод, который ищет в arrayList, если есть два числа, сумма которых равна переменной elem . Проблема в том, что сумма переменной превышает размер типа long. Как я могу написать это?

public static boolean searchSum(ArrayList<Long> array, long elem) {
   int left = 0, right = array.size()-1;
   while (left<right) {
     long n1=Long.valueOf(array.get(left));
     long n2=Long.valueOf(array.get(right));
     if ((n1+n2)==elem) return true;
     else if ((n1+n2)<elem) left++;
     else right--;
   }
   return false;
 }

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Я бы порекомендовал написать его, добавив отдельные цифры, и, если он равен или превышает длину, которую вы длинны, вы разбиваете его на две длины или массив и получаете доступ к цифрам таким образом для более длинной математики.

0 голосов
/ 03 мая 2018

Вам не нужно BigInteger, чтобы сообщить, что сумма двух одинаковых чисел со знаком (здесь: long s) переполнена.

  • если оба слагаемых имеют разные знаки: переполнения нет
  • оба слагаемых положительны: переполнение, если сумма <любое (каждое) слагаемое </li>
  • оба слагаемых отрицательны: переполнение, если любое (каждое) слагаемое <сумма </li>
0 голосов
/ 03 мая 2018

Вы можете использовать java.math.BigInteger. Может хранить неизменяемое целое число произвольной точности.

Например:

public BigInteger sum(Long number1, Long number2) {
    BigInteger bigNumber1 = BigInteger.valueOf(number1);
    BigInteger bigNumber2 = BigInteger.valueOf(number2);
    BigInteger result = bigNumber1.add(bigNumber2);
    return result;
}

В этом случае вы можете переписать этот метод следующим образом:

public static boolean searchSum(ArrayList<Long> array, long elem) {

    BigInteger bigElem = BigInteger.valueOf(elem);        
    int left = 0, right = array.size() - 1;

    while (left < right) {
        BigInteger n1 = BigInteger.valueOf(array.get(left));
        BigInteger n2 = BigInteger.valueOf(array.get(right));
        BigInteger sum = n1.add(n2);

        if (sum.equals(bigElem)) {
            return true;
        } else if (sum.compareTo(bigElem) < 0) {
            left++;
        } else {
            right--;
        }
    }
    return false;
}
...