论C语言两整数平均值的4种算法

发布时间:2020-07-08 20:50:19 作者:wx5d26a62f6f381
来源:网络 阅读:1383
  1. 小学数学中我们就学过一种简单的求解两个整数平均数的算法(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;
}

论C语言两整数平均值的4种算法论C语言两整数平均值的4种算法

但是这种方法有弊端,我们都知道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;
}

论C语言两整数平均值的4种算法

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


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

图解

论C语言两整数平均值的4种算法

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

#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;
}

论C语言两整数平均值的4种算法


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

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

论C语言两整数平均值的4种算法

#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;
}

论C语言两整数平均值的4种算法论C语言两整数平均值的4种算法

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


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

论C语言两整数平均值的4种算法论C语言两整数平均值的4种算法

我们用代码进行验证:

#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;
}

论C语言两整数平均值的4种算法




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

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

推荐阅读:
  1. PHP 计算两个特别大的整数
  2. 【算法日常】链表节点两两交换

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

平均数整数整数算法整数平均数

上一篇:基本的 RDD 操作——PySpark

下一篇:exchange2016 4节点完整安装之发送连接器配置

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》