计算两个数平均值的三种方法

第一种方法:

思路:两数相加求和再除2

代码

int a=10;

int b=20;

int avg=0;

avg=(a+b)/2;//平局值

//或者

avg=(a+b)>>1://右移表示除2,左移表示乘2

这种方法最为简单,弊端是如果a和b非常大的话,a+b的值可能超过了整型的储存范围(最大值为2147483647),导致溢出,得到错误的结果,此方法不够好。


第二种方法:

思路:用一个较大值减去另一个较小值得到二者之差,将差除2后加上较小值即得到了二者平均值,可有效防止溢出的情况的出现。

图解:

计算两个数平均值的三种方法_第1张图片

第一步:将a分成a-b和b

计算两个数平均值的三种方法_第2张图片

第二步:将a-b的值平分再加上b得到a与b的平均值

计算两个数平均值的三种方法_第3张图片

代码:

int a=10;

int b=20;

int avg=0;

avg=b+(a-b)/2;//平均值

//或者

avg=b+(a-b)>>1://右移表示除2,左移表示乘2




第三种方法:

思路:利用位与(&)提取出两个数相同的部分,利用异或(^)拿出两个数不同的部分的和,相同的部分加上不同部分的和除2即得到两个数的平均值。

图解:例如求解10与12的平均值

 

第一步:将两个数拆分出两者的公共部分和不同的部分,利用位运算&

10&12得到二进制    1000

计算两个数平均值的三种方法_第4张图片 

第二步:计算两个数不同部分的和

10^12得到    0010+0100

计算两个数平均值的三种方法_第5张图片

1000            10&12可得到

0010+0100      10^12可得到

计算a与b的平均值C语言表达式

avg = (a&b)  + (a^b)>>1;

 

代码:

int a=10;

int b=20;

int avg=0;

avg = (a&b)  + (a^b)>>1;

//或者

avg = (a&b)  + (a^b)/2;




你可能感兴趣的:(面试题)