接受答案后(4 年)
我希望该功能int average_int(int a, int b)
能够: 1. 在和的所有组合
的整个范围内工作。
2. 与 具有相同的结果,就像使用更广泛的数学一样。[INT_MIN..INT_MAX]
a
b
(a+b)/2
当int2x存在时,@Santiago Alessandri方法效果很好。
int avgSS(int a, int b) {
return (int) ( ((int2x) a + b) / 2);
}
否则@AProgrammer的变化:
注意:不需要更广泛的数学。
int avgC(int a, int b) {
if ((a < 0) == (b < 0)) { // a,b same sign
return a/2 + b/2 + (a%2 + b%2)/2;
}
return (a+b)/2;
}
具有更多测试但没有的解决方案%
以下所有解决方案“工作”到 (a+b)/2
没有发生溢出时的 1 以内,但我希望找到一个与(a+b)/2
所有int
.
@Santiago Alessandri只要范围int
小于范围, @Santiago Alessandri 解决方案就可以工作long long
-通常是这种情况。
((long long)a + (long long)b) / 2
@AProgrammer,接受的答案,大约有 1/4 的时间失败 match (a+b)/2
。示例输入如a == 1, b == -2
a/2 + b/2 + (a%2 + b%2)/2
@Guy Sirton,解决方案大约有 1/8 的时间无法匹配(a+b)/2
。示例输入如a == 1, b == 0
int sgeq = ((a<0)==(b<0));
int avg = ((!sgeq)*(a+b)+sgeq*(b-a))/2 + sgeq*a;
@R..,解决方案大约有 1/4 的时间无法匹配(a+b)/2
。示例输入如a == 1, b == 1
return (a-(a|b)+b)/2+(a|b)/2;
@MatthewD,现在删除的解决方案大约有 5/6 的时间无法匹配(a+b)/2
。示例输入如a == 1, b == -2
unsigned diff;
signed mean;
if (a > b) {
diff = a - b;
mean = b + (diff >> 1);
} else {
diff = b - a;
mean = a + (diff >> 1);
}