平均数的N种求法

本文介绍了计算两个整数平均数的三种方法:直接求和除以二、使用相减除二加减数、以及利用位运算求平均数。详细解释了每种方法的原理,包括如何避免溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:
已知两个数字a,b,求平均数,最简单容易想到的方法就用(a+b)/2

#include <stdio.h>
#include <stdlib.h>        
int main ()
{
  int m=0;
  int n=0;
  int half=0;
  printf ("请输入2个数字: ");
  scanf ("%d%d",&m,&n);   //随机输入2个数字
  half=(m+n)/2;         //2个数字相加,除2就是平均数
  printf ("%d\n",half);
  system ("pause");   //系统函数,防止编译结果快闪
  return 0;
}

此方法简单易理解,但是它存在缺陷,如果数字过大会溢出,因此计算平均数时就会出错,它只适合计算2个小数字的平均数。

方法二:
||||| a
||||||||| b
||||||| a+(b-a)/2
已知2个数字a,b,用a+(b-a)/2 可求出两个数的平均数,这个可以僻免数字过大溢出(数字特别特别大时仍会溢出,伪溢出),基本不用考虑2个数字的大小。

#include <stdio.h>
#include <stdlib.h>
int main ()
{
  int m=0;
  int n=0;
  int half=0;
  printf ("请输入2个数字: ");
  scanf ("%d%d",&m,&n);  //随机输入2个数字
   half=n+(m-n)/2;      //数字相减除二再加上减数,不用考虑相减时的大小
  //half=m+((n-m)>>1);    //左移操作符相当与除二,右移操作符相当与乘二
  printf ("%d\n",half);
  system ("pause");
  return 0;
}

方法三:
15&7 ------ 0111
15 ^ 7 ------- 1000
11 -----------1011
已知2个数字a,b,用(a&b)+(a^b)/2也可求得平均数 (转化成相同部分保留,不同部分各加一半)

#include <stdio.h>
#include <stdlib.h>
int main ()
{
  int m=0;
  int n=0;
  int half=0;
  printf ("请输入2个数字: ");
  scanf ("%d%d",&m,&n);
  half=(m&n)+(m^n)>>1;
  //half=(m&n)+((m^n)/2);   
  printf ("%d\n",half);
  system ("pause");
  return 0;
}

此方法一定不会溢出,因为计算时并无进位,在运用操作符时记得要考虑它的有优先级,防止错误发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值