Java 当堆栈出现溢出时,取整数(j+k)/2的平均值

Java 当堆栈出现溢出时,取整数(j+k)/2的平均值,java,overflow,average,Java,Overflow,Average,如果存在int j=Integer.MAX_值和int k=Integer.MAX_值,我如何计算平均j+k/2,以便结果=Integer.MAX_值而不会导致溢出。在这种情况下,j+k/2与j/2+k/2相同 根据bilalba进行修正 int j = Integer.MAX_VALUE; int k = Integer.MAX_VALUE; int res = (j/2) + (k/2) + (j%2 & k%2); System.out.print

如果存在int j=Integer.MAX_值和int k=Integer.MAX_值,我如何计算平均j+k/2,以便结果=Integer.MAX_值而不会导致溢出。

在这种情况下,j+k/2与j/2+k/2相同

根据bilalba进行修正

    int j = Integer.MAX_VALUE;
    int k = Integer.MAX_VALUE;

    int res = (j/2) + (k/2) + (j%2 & k%2);
    System.out.println(res);

在这种情况下,j+k/2与j/2+k/2相同

根据bilalba进行修正

    int j = Integer.MAX_VALUE;
    int k = Integer.MAX_VALUE;

    int res = (j/2) + (k/2) + (j%2 & k%2);
    System.out.println(res);
j%2和k%2用于处理两种奇数情况。如果j,k=1,那么j/2+k/2只会给你0

这是因为0.5将被分解为下一个最小的整数,即0

j%2和k%2用于处理两种奇数情况。如果j,k=1,那么j/2+k/2只会给你0

这是因为0.5将被分解为下一个最小的整数,即0

你可以写,j/2+k/2。下面是使用典型方法的两个小数字10和11的示例

10 + 11 = 21
21/2 = 10.5
另一方面:

10/2 = 5;
11/2 = 5.5;
5.5+5 = 10.5;
正如您在这里看到的,无论哪种方法,您都将得到相同的结果,只是您不必添加数字,因为这将导致溢出,正如您所提到的

编辑

我刚刚意识到这是错误的,只适用于偶数。以下是适用于所有数字的最佳解决方案

(j/2) + (k/2) + (j%2 && k%2);
你可以写,j/2+k/2。下面是使用典型方法的两个小数字10和11的示例

10 + 11 = 21
21/2 = 10.5
另一方面:

10/2 = 5;
11/2 = 5.5;
5.5+5 = 10.5;
正如您在这里看到的,无论哪种方法,您都将得到相同的结果,只是您不必添加数字,因为这将导致溢出,正如您所提到的

编辑

我刚刚意识到这是错误的,只适用于偶数。以下是适用于所有数字的最佳解决方案

(j/2) + (k/2) + (j%2 && k%2);


j+i-j/2相当于i+j/2,在这种情况下,当数字之间的差异很小时不会溢出。在这个表达式溢出的情况下,i+j/2将不会溢出。

j+i-j/2相当于i+j/2,在这种情况下,当数字之间的差异很小时不会溢出。在这个表达式溢出的情况下,i+j/2将不会与j/2+k相同。

/2@ScaryWombat你能把它作为一个答案而不是一个评论,这样我就可以把它标记为正确的答案吗?谢谢如果你正在达到整数。MAX_值,使用long不是更好吗?@Gendarme我需要一个只使用int的答案!但是,是的,long也会起作用。和j/2+k一样/2@ScaryWombat你能把它作为一个答案而不是一个评论,这样我就可以把它标记为正确的答案吗?谢谢如果你正在达到整数。MAX_值,使用long不是更好吗?@Gendarme我需要一个只使用int的答案!但是,是的,长时间也行。这实际上会给出错误的答案。它将给出Integer.MAX_值-1。您在@bilalba时是正确的。这种解决方案适用于大多数情况,但不适用于这种情况。这实际上会给出错误的答案。它将给出Integer.MAX_值-1。您在@bilalba时是正确的。此解决方案适用于大多数情况,但不适用于这种情况。感谢您的更正,但您的代码无法编译。看看我的答案,你会如何准确地将这个@bilalba编码。我想我理解你想说什么,但我不太确定你所说的+j%2&&k%2是什么意思,因为正如@trunray Wombat所说的,代码没有compile@Kekis2014我已经更正了我的答案,正确的代码应该是j/2+k/2+j%2&k%2;这只是其中之一&感谢您的更正,但是您的代码无法编译。看看我的答案,你会如何准确地将这个@bilalba编码。我想我理解你想说什么,但我不太确定你所说的+j%2&&k%2是什么意思,因为正如@trunray Wombat所说的,代码没有compile@Kekis2014我已经更正了我的答案,正确的代码应该是j/2+k/2+j%2&k%2;这只是其中之一&