两个整型数据求平均数
- 两数相加除以2
这种写法是简单将两个数相加,然后除以2。
#include <stdio.h>
int main()
{
int x = 2;
int y = 3;
int count = (x+y)/2;
printf("%d\n",count);
return 0;
}
这种代码是有弊端的,当x+y的值大于2147483674时会发生溢出(32位机器上int占4个字节,范围是-2147483648~2147483674),这种情况下两个正数求出的平均值就是负数!如下:
#include <stdio.h>
int main()
{
int x = 0x7fffffff;
int y = 0x7ffffffd;
int count = (x+y)/2;
printf("%d\n",count);
return 0;
}
运行结果如下图
下面这种写法可以避免这种弊端。
2.两数相减除以2再加两数间的较小数
有x = 6, y = 10;x和y的平均数是(10+6)/2 = 8;可以看出,y(10)比x(6)大4,把y大于x的这部分的(4)一半拿出来给x,那么x和y就一样大了,就是原来x和y的平均数,即x和y的平均数就是两数相减除以2再加上较小数。
代码如下:
#include <stdio.h>
int main()
{
int x = 0x7fffffff;
int y = 0x7ffffffd;
int count = (x-y)/2+y;
printf("%d\n",count);
return 0;
}
运行结果如下:
除此之外还可以用位操作来计算。
3.两数相与加上两数异或除以2
两数相与是将两个数中相同的位留下来,举个例子,x = 14(二进制码为1110,前面的0在这里为了方便计算就忽略掉),y = 7(0111)。x&y = 6(0110),与操作下来,两个数中bit位相同的bit位就留下来了,接下来就算bit位不同的部分,这部分可以用异或操作来得到。x^y = 1001;然后除以2加上前面bit位相同的部分,就是这两个数的平均数。
这种方法和上面第二种有异曲同工之妙。都是先把相同的部分提出来,然后剩下的除以2再加上之前提出来的部分就是平均数,只不过第二种将较小数提了出来,第三种将两个数中共有的部分提了出来。
代码如下:
#include <stdio.h>
int main()
{
int x = 0x7fffffff;
int y = 0x7ffffff0;
int count = (x&y)+(x^y)/2;
printf("%d\n",count);
return 0;
}
运行结果:
第三种方法看上去较第二种方法复杂一点,但第三种方法不必写第二种方法中的判断两个数中的较小数这一步。