求平均数的三种方法

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

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);
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值