求两个正整数均值(防溢出)
来源:互联网 发布:海量数据存储算法 编辑:程序博客网 时间:2024/06/10 07:10
两个整数平均数(防溢出,向下取整)
已知两个整数a
、b
,a
和b
的值均没有出现溢出,而a + b
有可能出现溢出,例如在归并排序中,通过mid = (low + high)/2
求中位值,就可能整数溢出问题。现在需要在防止溢出的情况下求a和b的平均值,该平均值取其实际值的向下取整。
思路一:求两个数的平均值最常见的思路就是将两个数相加,然后除以
2
,但是此处两个数相加可能出现溢出;思路二:可以考虑将
a
和b
先分别除以2
,再求和。但程序中整数相除,通常向下取整(如Java
),直接a/2 + b/2
可能出现平均数偏差。例如求整数3
和5
平均值,在Java
中3/2 + 5/2
得到的值将会是3
。这是因为Java
中整数相除进行了向下取整,实际上Java
中3/2 = 1
,5/2 = 2
。为了避免这种情况,可以分别对a
,b
进行求商运算和求余运算,然后对商运算的结果和求余运算结果相加,如下:
avg = a / 2 + b / 2 + (a % 2 + b % 2) / 2;
位运算求解
在思路二解法的基础上,利用计算机位运算特性,对2
的取商运算和取余运算进行简化。在位运算中,对整数右移一位相当于除以2
并向下取整,即对2
求商;而对整数2
取余只有两种情况,余数要么0
,要么1
,因此可以利用位运算中与运算&
,整数对1
进行与运算&
,偶数得到余就是0
,奇数得到余就是1
。因此最终得到的程序算式如下:
avg = (a >> 1) + (b >> 1) + (((a & 1) + (b & 1)) >> 1);
- 需要注意程序语言中运算符优先级,Java中运算符优先级:
()
–>+
–>>>
–>&
以下给出两种方法的java代码:
// 取商均值 + 取余均值 public int getAvgOfTwoIntNormal(int a, int b) { int avg = a / 2 + b / 2 + (a % 2 + b % 2) / 2; return avg; } // 通过位运算 public int getAvgOfTwoIntByBitwise(int a, int b) { //注意操作符优先级 int avg = (a >> 1) + (b >> 1) + (((a & 1) + (b & 1)) >> 1); return avg; }
参考
在防止溢出的情况下求两个整数的平均数(向下取整)
阅读全文
0 0
- 求两个正整数均值(防溢出)
- 求平均值 防溢出方法
- 求任意两个正整数的和,无论它有多大,考虑溢出情况
- 求两个正整数的最大公约数?
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数
- 求两个正整数的最小公倍数
- 求两个正整数的最大公约数
- 求两个正整数正值差
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数
- 求两个正整数的最大公约数(GCD)
- 求两个给定正整数的正差值
- 求两个正整数的正差值
- 生成订单号
- javascript获取项目根目录带项目名
- 13-CSS3提高
- 在C/C++语言中使用正则表达式
- 【模板】树状数组的区间加值和区间查询
- 求两个正整数均值(防溢出)
- 2017 12 10 cf 个人赛--题解 SDUT 2017 Autumn Single Contest L
- 最好用的 IntelliJ 插件 Top 10
- 漫画:什么是 volatile 关键字?
- 深度学习(十一)——Winograd(1)
- 8086汇编语言程序设计
- 国务院为何力推公共资源配置领域政府信息公开?
- SparkStreaming计算WordCount简单示例
- 35 个 Java 代码性能优化总结