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

#include

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

#include

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

#include

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

#include

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

#include

int main() {

int a = 2;

int b = 10;

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

system("pause");

return 0;

}

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

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

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

  1. c语言编写程序求8,使用c语言编写程式,实现计算1*2*3+4*5*6+7*8*9+……+28*29*30的值...

    使用c语言编写程式,实现计算1*2*3+4*5*6+7*8*9+--+28*29*30的值以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快 ...

  2. C语言设计函数求最大公约数,C语言程序设计课程设计--编写函数求取两个整数m,n的最大公约数和最小公倍数.doc_在线文库www.lddoc.cn...

    C语言程序设计课程设计--编写函数,求取两个整数m,n的最大公约数和最小公倍数.doc C语言程序设计课程设计C语言程序设计课程设计评语考勤(10)纪律(10)过程(40)设计报告(30)答辩(10) ...

  3. 使用c语言求和与求平均数

    求和的方法有很多,我这里介绍的是利用数组和for循环,从定义变量开始,给数组赋一个名称,然后定义一个空值,用来表示循环次数,再在循环语句下面设置一个空值用于接受循环出的值,再通过循环语句与之相加,最后 ...

  4. c语言中除法怎么取模,c语言如何取模运算

    满意答案 hqshi888 2017.08.27 采纳率:45%    等级:13 已帮助:12014人 C语言用取模运算符"%"进行取模运算. 取模运算符"%" ...

  5. c语言一维数组求平均成绩,C语言 计算一维数组平均值(函数).doc

    酒谆亥布福墅瞒筹崖锈促担粟靡鳖啤酒痘结挂震锈允沤施磕羹磋蝴禽埔鼓逻去晚茂唇魏纤垂巢愈敛下磺蹦迟秩巧苟盐骑榷忽桂蛛牙婆杉蘸痈瘟汐惭嚼事刽霖嗓酱阵瓷练喷敝渭铭咀檀毕舵砌汾弃渣乌斟浸道栽强藐颇一硼尤醉背即侯 ...

  6. c语言使用格里高利求pi,用c语言编写程序4.ppt

    用c语言编写程序4 第 四 章 循环结构 4.1 用格里高利公式求π的近似值 (while语句) 4.2 统计一个整数的位数 (do-while语句) 4.3 判断素数 (break 和 contin ...

  7. c语言用判别式求二元一次方程,C语言编写二元一次方程的判别式

    求列这两道题的二元一次方程 1.设甲速度为X乙速度为Y(2+2.5)X+2.5Y=363X+(2.3)Y=362.2人间为X3人为Y2人间每天2*353人间每天3*252X+3Y=702*35X+3* ...

  8. c语言结构体求分数和,C语言 定义一个表示分数的结构体,并求两个分数相加之和...

    满意答案 正义使者_AYY 2014.08.20 采纳率:53%    等级:8 已帮助:711人 //结构定义中包含两个成员,分子和分母 struct fraction { int up, down ...

  9. c语言复数除法结构体,试用C语言的结构类型定义表示复数的抽象数据类型。

    满意答案 horoggg 2014.09.03 采纳率:58%    等级:9 已帮助:462人 struct num { float a;/*实部*/ float b;/*虚部*/ }; struc ...

最新文章

  1. 分析460万份数据发现,女警比男警检查汽车几率少2倍,但发现违禁品还多10%
  2. java的collection集合
  3. C++ 计算并输出三角形的面积
  4. 使用C#实现Morse码的输出
  5. VS2015中配置MSComm通讯控件和注意事项
  6. cf1556B B. Take Your Places!
  7. ImagesSprite V1.1.1 Beta发布
  8. IOS开发学习记录第4天之C语言学习
  9. dj鲜生-26-登陆时-记住用户名的操作
  10. Ubuntu12.04 搭建TFTP服务
  11. 【多任务】如何利用多任务学习提升模型性能?
  12. linux无法侦听10000以上的端口,linux – git-daemon:“无法在主机(null)端口9418上分配任何侦听套接字”...
  13. 扇贝有道180923每日一句
  14. 2022天勤数据结构
  15. 【ffmpeg】视频解码器
  16. 交通部 808 协议2019版 - 免费下载 - 官网下载
  17. 白帽专访丨大家好,我是阿杨,一个全职挖洞选手。
  18. Java HashMap底层实现和原理分析(一)
  19. 显示无法定位程序输入点_CxxFrameHandler4于动态链接库,该怎么解决?
  20. java单词匹配算法_前端学数据结构与算法(八): 单词前缀匹配神器-Trie树的实现及其应用...

热门文章

  1. 朋友圈投票活动-刷票案例实现与分析
  2. 电脑硬盘怎样合并分区?
  3. VMware Workstation虚拟机设置静态ip
  4. (附源码)springboot法律全书 毕业设计 280844
  5. mysql数据库完整实例-“汽车维修”
  6. mysql 校对规则作用_讲讲Mysql中的校对规则究竟是怎么一回事
  7. JS实现小方块上下移动
  8. insert 锁表 mysql_mysql insert锁机制【转】
  9. 在main.js引入模块时,无法找到模块“”的声明文件
  10. 实验8 脉冲宽度调制(PWM)模块 北京化工大学 2019090034