我正在尝试将数字数组中的两个最大数相乘。对于少量数字,它可以正常工作。
正确的输入/输出-可以正常工作:
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));
}
答案 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
数组是否确实包含至少两个元素。这称为保护声明。
最后请记住,byte
,short
和long
都包含特定位数的带符号数字。基本上,您正在执行计算模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
来乘以浮点数。