方法一:
已知两个数字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;
}
此方法一定不会溢出,因为计算时并无进位,在运用操作符时记得要考虑它的有优先级,防止错误发生