求平均数的三种方法

第一种:常规法
先求两个数之和,再除以二(或者右移一位)。

int a,b,c=0;
scanf("%d%d",&a,&b);
c=(a+b)/2;//c=(a+b)>>1;
printf("%d",c);

但是这种方法有可能会导致数据溢出。那么我们又会想到,将两个数分别右移一位再相加,这对于偶数是可行的,但是如果两个数都是奇数会导致错误,需要在 奇数的结果后面再加一个1,可以通过分情况来解决。

int a,b,c=0;
scanf("%d%d",&a,&b);
if(a%2==1&&b%2==1)
{
       c=a>>1+b>>1+1;
}
else
{
       c=a>>1+b>>1;
}

这样未免有点繁琐,求个平均数还兴师动众的。
第二种:求差法
我们可以通过图片来理解:从图中我们能看到,a和b相差的部分为a-b,那么b加上一个(a-b)的一半,或者a减去一个(a-b)的一半,得到的不就是a和b的平均值吗。
在这里插入图片描述

int a,b,c=0;
scanf("%d%d",&a,&b);
c=b+(a-b)/2
printf(“%d”,c);

那么这样就能有效地避免数据溢出问题。
第三种:求同异法
我们知道任何一个数在内存中是以二进制存放的,我们可以通过&求得两个数比特位的相同部分,通过^得到两个数的不同部分。而不同的部分恰好是a比b多出的部分,所以a+b可表示为(a&b)*2+(a ^b).那么平均数就是(a&b)+(a ^b)/2;

int a,b,c=0;
scanf("%d%d",&a,&b);
c=(a&b)+(a ^b)/2;//c=(a&b)+(a^b)>>1
printf("%d",c);
发布了50 篇原创文章 · 获赞 30 · 访问量 9178

猜你喜欢

转载自blog.csdn.net/qq_42913794/article/details/89449344