平均数的N种求法

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

#include 
#include         
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 
#include 
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 
#include 
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;
}

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

你可能感兴趣的:(C语言)