小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言
#include<stdio.h> #include<stdlib.h> int main() { int a = 10; int b = 20; printf("%d\n", (a + b) / 2); system("pause"); return 0; }
但是这种方法有弊端,我们都知道int是4个字节也就是32个比特位如果a和b的数加起来超过×××所能容纳的数字,我们就无法得到a和b的平均值
#include<stdio.h> #include<stdlib.h> int main() { int a = 2000000000; int b = 2000000000; printf("%d\n", (a + b) / 2); system("pause"); return 0; }
如图我们并不能求出a和b的平均值;
2.所以我们在写代码过程中为了避免此类情况的发生,我们采用另一种方法a+(b-a)/2,这样,只要a和b不越界,他们的平均值就可以算出来
图解
用这种方法就不会导致上面的情况发生
#include<stdio.h> #include<stdlib.h> int main() { int a = 2000000000; int b = 2000000004; printf("%d\n", b+(a-b)/2); system("pause"); return 0; }
3.可是如果考虑这个方法的效率的话,我觉得这个方法不太完美,在C语言中除法的算法是最复杂的,时间最长,所以我们应该用一种方法来替代这个除法,大家先看这个算式b+(a-b)>>1;
用2进制右移的方法我们避免了这个问题;
#include<stdio.h> #include<stdlib.h> int main() { int a = 2000000000; int b = 2000000004; printf("%d\n", b+((a-b)>>1)); system("pause"); return 0; }
我们得出同样的答案,并且缩短了这个程序运行时间,使得代码效率提升。
4.当然我们提到了二进制向右移位来求解,是否还有其它方法来求解呢,最后一种方法:AVG=(a&b)+((a^b)>>1),很多人可能一眼看不懂这个代码,我们来详细图解一下
我们用代码进行验证:
#include<stdio.h> #include<stdlib.h> int main() { int a = 2; int b = 10; printf("%d\n", (a&b)+((a^b)>>1)); system("pause"); return 0; }
----------------------------------------------------------------------------------------------------------------------------------
总结:以上就是整数求平均数的四种算法,前三种慢慢递进,解决掉一些潜在bug或着提升计算效率,第四种效率也很高,但是不容易理解,大家还有什么求整数平均数的算法,欢迎在评论区留言
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。