堆栈溢出时取整数 (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)
。下面是两个小数字 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
不会。
如果有一个 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)
。下面是两个小数字 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
不会。