小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言#include
#include
intmain(){
inta=10;
intb=20;
printf("%d\n",(a+b)/2);
system("pause");
return0;
}
但是这种方法有弊端,我们都知道int是4个字节也就是32个比特位如果a和b的数加起来超过×××所能容纳的数字,我们就无法得到a和b的平均值#include
#include
intmain(){
inta=2000000000;
intb=2000000000;
printf("%d\n",(a+b)/2);
system("pause");
return0;
}
如图我们并不能求出a和b的平均值;
2.所以我们在写代码过程中为了避免此类情况的发生,我们采用另一种方法a+(b-a)/2,这样,只要a和b不越界,他们的平均值就可以算出来
图解
用这种方法就不会导致上面的情况发生#include
#include
intmain(){
inta=2000000000;
intb=2000000004;
printf("%d\n",b+(a-b)/2);
system("pause");
return0;
}
3.可是如果考虑这个方法的效率的话,我觉得这个方法不太完美,在C语言中除法的算法是最复杂的,时间最长,所以我们应该用一种方法来替代这个除法,大家先看这个算式b+(a-b)>>1;
用2进制右移的方法我们避免了这个问题;
#include
#include
intmain(){
inta=2000000000;
intb=2000000004;
printf("%d\n",b+((a-b)>>1));
system("pause");
return0;
}
我们得出同样的答案,并且缩短了这个程序运行时间,使得代码效率提升。
4.当然我们提到了二进制向右移位来求解,是否还有其它方法来求解呢,最后一种方法:AVG=(a&b)+((a^b)>>1),很多人可能一眼看不懂这个代码,我们来详细图解一下
我们用代码进行验证:#include
#include
intmain(){
inta=2;
intb=10;
printf("%d\n",(a&b)+((a^b)>>1));
system("pause");
return0;
}
----------------------------------------------------------------------------------------------------------------------------------
总结:以上就是整数求平均数的四种算法,前三种慢慢递进,解决掉一些潜在bug或着提升计算效率,第四种效率也很高,但是不容易理解,大家还有什么求整数平均数的算法,欢迎在评论区留言
如果觉得《c语言用除法求平均数 论C语言两整数平均值的4种算法》对你有帮助,请点赞、收藏,并留下你的观点哦!