我们最直接的方法就是(a+b)/2
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int ave(int x, int y)
{
return (x + y) / 2;
}
int main()
{
int a, b = 0;
printf("输入两个数:\n");
scanf("%d%d", &a, &b);
printf("ave=%d\n", ave(a, b));
system("pause");
return 0;
}
但是,这么书写,有没有问题呢?
如果给a,b赋值INT_MAX(2147483647 ) -1
为什么结果是 -2?
这是因为我们对两个数求平均值,是先将这两个数加起来,这就会导致溢出。
优化1:
通过画图我们知道,我们将b比a多出来的部分裁剪一半给a,这时候的a/b就是平均值
int ave(int x, int y)
{
return y + (x - y) / 2;
}
优化2:使用位运算,且不使用“+”,求平均值
(百度面试题)
思路:
我们先求两数的和,将(a&b)+((a^b)>>1 )
这里使用了“+”,我们将“+”两边的数字,不断的进行a^b和(a&b) << 1
直到(a&b) << 1为0,此时的a^b就为平均值。
int add(int a, int b)
{
int wei = 0;
int jw = 0;
do{
wei = a^b;
jw = (a&b) << 1;
a = wei;
b = jw;
} while (jw != 0);
return wei;
}
int ave(int x, int y)
{
return add(x&y, ((x^y) >> 1));
}