如何在Java中将两个long值相乘

时间:2018-08-26 12:13:46

标签: java multiplying

我正在尝试将数字数组中的两个最大数相乘。对于少量数字,它可以正常工作。

正确的输入/输出-可以正常工作:

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 :(得分:3)

您的代码中有一个错误: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数组是否确实包含至少两个元素。这称为保护声明

最后请记住,byteshortlong都包含特定位数的带符号数字。基本上,您正在执行计算模2 ^ n ,其中n是位大小。如果该值太大,则可能会溢出并返回错误的结果。为此,您需要BigInteger

答案 1 :(得分:2)

您正在用另一个数字替换该索引中的原始数字。 这就是问题所在。

请简单地从下面的逻辑中找到最大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();

        }
    }

答案 2 :(得分:1)

请尝试使用Long乘以适合BigInteger的较大值,而不是long,否则结果可能溢出

使用BigDecimal来乘以浮点数。