我正在调用getMaxPairwiseProduct()方法,但它返回“product”变量的溢出值。我已经在使用long了,产品实际上是在长的限制但我无法理解为什么它返回溢出值。
import java.util.Scanner;
public class MaxPairwiseProduct {
static long getMaxPairwiseProduct(int[] array){
//int product =0 ;
int n = array.length;
//for(int j =0; j<n ; ++j){
//}
QuickSort(array, 0, array.length -1 );
int n1 = (array[array.length-1]);
int n2 = (array[array.length-2]);
long product =n1 * n2;
System.out.println(product);
return product;
}
private static void QuickSort(int[] arr, int left, int right){
int index = partition(arr,left, right);
if(left < index - 1)
QuickSort(arr, left, index -1);
if(index < right)
QuickSort(arr, index, right);
//System.out.println(index);
}
private static int partition(int[] arr, int left, int right){
int pivot = arr[(left + right )/2];
while(left<=right){
while(arr[left] < pivot) left++;
while(arr[right] > pivot) right--;
if(left<= right){
int temp= arr[left];
arr[left] = arr[right];
arr[right] =temp;
left++;
right--;
}
}
return left;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/*int n = sc.nextInt();
int[] array = new int[n];
for(int i=0; i <n;++i){
array[i] = sc.nextInt();
}
*/
int[] array = new int[]{100000, 90000};
long product = getMaxPairwiseProduct(array);
System.out.println(product);
}
}
答案 0 :(得分:3)
长话短说,在Java中,默认情况下,每个整数(非小数)数字都被视为int
,您的行:
long product =n1 * n2;
将两个int
值相乘,这些值将溢出,只有获得溢出结果后,它才会被转换为long并保存在product
变量中。
修复?
将两个操作数中的一个显式地转换为long
,这样的方法可以起作用:
long product = (long)n1 * n2;
Java将自动开始使用“最大”数据类型,因此,由于您将long
和int
相乘,int
或n2
将隐式转换为{ {1}}同样,不会发生溢出,你应该得到正确的结果。