Как умножить два длинных значения в Java - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь умножить два самых больших числа из массива чисел.Хорошо работает для небольших чисел.

Правильный ввод / вывод - это работает:

3 10 2 8 80

Правильный ввод / вывод - это ошибка:

2 100000 90000
9000000000

Вместо этого у меня выводится 10000000000.

Может кто-нибудь сказать мне, что не так в моем коде?

public static Long sumPairwise(Long[] numbers){

        int index=0;
        int n = numbers.length;
        for(int i=1;i<n;i++){
            if(numbers[i]>numbers[index])
                    index=i;
        }
        numbers[n-1]= numbers[index];
        index=0;
        for(int j=1;j<n-1;j++){
        if(numbers[j]>numbers[index])
                index=j;
        }
        numbers[n-2]=numbers[index];
        Long product = (numbers[n-2])*(numbers[n-1]);

    return product ;
}
public static void main(String [] args){
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    Long numbers[] = new Long[n];
    for (int i=0;i<n;i++)
    numbers[i]= sc.nextLong();
    System.out.println(sumPairwise(numbers));

}

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Вы заменяете исходный номер в этом индексе другим номером. Это вызывает проблему.

Пожалуйста, просто найдите макс. 2 числа из приведенной ниже логики и умножьте. Кроме того, не забудьте закрыть сканер.

Здесь простое решение. Это будет работать только для натуральных чисел.

import java.util.Scanner;

    public class Snippet {
        public static long multiplyHighestTwoValues(Long[] numbers) {

            long maxOne = 0;
            long maxTwo = 0;
            for (long n : numbers) {
                if (maxOne < n) {
                    maxTwo = maxOne;
                    maxOne = n;
                } else if (maxTwo < n) {
                    maxTwo = n;
                }
            }

            long product = maxOne * maxTwo;
            return product;
        }

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            Long numbers[] = new Long[n];
            for (int i = 0; i < n; i++)
                numbers[i] = sc.nextLong();
            System.out.println(sumPairwise(numbers));
            sc.close();

        }
    }
0 голосов
/ 26 августа 2018

В вашем коде есть ошибка: numbers[n-1] вполне может содержать второе по величине число. Вы перезаписываете это число самым большим числом в своем коде, прежде чем пытаться поставить его с первой на последнюю позицию.

Один из способов преодолеть это - отсортировать массив, используя Arrays.sort, таким образом, вы уверены, что последние два числа являются старшим, а второе - самым высоким числом.

public static long multiplyLargestTwoNumbers(long[] numbers) {
    long[] sortedNumbers = numbers.clone();
    Arrays.sort(sortedNumbers);

    int size = numbers.length;
    // multiply highest and second highest number
    return sortedNumbers[size - 1] * sortedNumbers[size - 2];
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    long numbers[] = new long[n];
    for (int i = 0; i < n; i++) {
        numbers[i] = sc.nextLong();
    }
    System.out.println(multiplyLargestTwoNumbers(numbers));
}

Другие изменения:

  • с использованием long вместо Long: попробуйте использовать примитивные типы, когда объективные ссылочные типы не нужны (вам нужно Long, если вы хотите использовать, например, List, потому что List может содержать только ссылки на объекты);
  • разнесены for петли, пожалуйста, используйте пробел;
  • переименованный метод, поскольку он ничего не добавляет попарно;
  • использовались фигурные скобки для for цикла в основном методе;
  • удалены ложные скобки в части, которая выполняет умножение.

Вы также можете ввести оператор if, который сначала проверяет, действительно ли массив numbers содержит хотя бы два элемента. Это называется охранное заявление .

Наконец, помните, что byte, short и long все содержат числа со знаком определенного размера. В основном вы выполняете вычисления модуль 2 ^ n , где n - размер бита. Если значение слишком велико, оно может переполниться и вернуть неверный результат. Для этого вам нужно BigInteger.

0 голосов
/ 26 августа 2018

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

Используйте BigDecimal вместо умножения чисел с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...