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

Taking the Average of Integers (j+k)/2 when stack there is an Overflow

如果有一个 int j = Integer.MAX_VALUE 和一个 int k = Integer.MAX_VALUE 我如何计算平均值 (j+k)/2 以便 result = Integer.MAX_VALUE 不会导致溢出。

在这种情况下 (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%2) && (k%2))

((j%2) && (k%2)) 是为了满足两种奇数情况。如果 j,k= 1,那么 j/2+k/2 只会给你 0.

这是因为 0.5 将取下一个最小整数 0。

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

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 不会。