c语言用除法求平均数,论C语言两整数平均值的4种算法

小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言#include

#include

int main() {

int a = 10;

int b = 20;

printf("%d\n", (a + b) / 2);

system("pause");

return 0;

}

f9e9df1aea042bfdf5838a2f68414145.png

7d1e931bb61a5cbbaff7ff9c80dc73b9.png

但是这种方法有弊端,我们都知道int是4个字节也就是32个比特位如果a和b的数加起来超过×××所能容纳的数字,我们就无法得到a和b的平均值#include

#include

int main() {

int a = 2000000000;

int b = 2000000000;

printf("%d\n", (a + b) / 2);

system("pause");

return 0;

}

db592efaaa3c8b5c25d5ac951e9c95bf.png

如图我们并不能求出a和b的平均值;

2.所以我们在写代码过程中为了避免此类情况的发生,我们采用另一种方法a+(b-a)/2,这样,只要a和b不越界,他们的平均值就可以算出来

图解

c语言用除法求平均数,论C语言两整数平均值的4种算法_第1张图片

用这种方法就不会导致上面的情况发生#include

#include

int main() {

int a = 2000000000;

int b = 2000000004;

printf("%d\n", b+(a-b)/2);

system("pause");

return 0;

}

a656e794eec231c462d287ecac5f314b.png

3.可是如果考虑这个方法的效率的话,我觉得这个方法不太完美,在C语言中除法的算法是最复杂的,时间最长,所以我们应该用一种方法来替代这个除法,大家先看这个算式b+(a-b)>>1;

用2进制右移的方法我们避免了这个问题;

c语言用除法求平均数,论C语言两整数平均值的4种算法_第2张图片#include

#include

int main() {

int a = 2000000000;

int b = 2000000004;

printf("%d\n", b+((a-b)>>1));

system("pause");

return 0;

}

f9e9df1aea042bfdf5838a2f68414145.png

de9b6c03843a7f63d0a2a470f40ab35b.png

我们得出同样的答案,并且缩短了这个程序运行时间,使得代码效率提升。

4.当然我们提到了二进制向右移位来求解,是否还有其它方法来求解呢,最后一种方法:AVG=(a&b)+((a^b)>>1),很多人可能一眼看不懂这个代码,我们来详细图解一下

f9e9df1aea042bfdf5838a2f68414145.png

c语言用除法求平均数,论C语言两整数平均值的4种算法_第3张图片

我们用代码进行验证:#include

#include

int main() {

int a = 2;

int b = 10;

printf("%d\n", (a&b)+((a^b)>>1));

system("pause");

return 0;

}

58836955c4df40caee83b0709cc20d38.png

----------------------------------------------------------------------------------------------------------------------------------

总结:以上就是整数求平均数的四种算法,前三种慢慢递进,解决掉一些潜在bug或着提升计算效率,第四种效率也很高,但是不容易理解,大家还有什么求整数平均数的算法,欢迎在评论区留言

你可能感兴趣的:(c语言用除法求平均数)