两个整数取中间值问题

  • 为什么建议用mid=L+(R-L)/2而不是mid=(L+R)/2
    • 1. 当L和R为指向数组元素的指针时
    • 2. 当L和R为负数时
    • 3. mid=(L+R)/2可能溢出而mid=L+(R-L)/2 不会溢出

假设L和R分别为两个合法整数且L<R,mid为其待求中间值。

为什么建议用mid=L+(R-L)/2而不是mid=(L+R)/2

1. 当L和R为指向数组元素的指针时

若执行 mid =(L + R)/ 2 则编译器会提示以下错误:

[Error] invalid operands of types ‘int*’ and ‘int*’ to binary ‘operator+’

显然编译器告诉我们 int* 类型(此处例子使用的int型数组)的指针变量做二进制加法是不合法的。

而执行 mid = L + (R - L) / 2 则可以得到预期结果。

2. 当L和R为负数时

当L和R为负数时,mid=L+(R-L)/2和mid=(L+R)/2计算结果是不一样的。
下面举两个栗子:

计算式子 L R mid
mid = (L+R)/2 1 4 2
mid = L+(R-L)/2 1 4 2
mid = (L+R)/2 -4 -1 -2
mid = L+(R-L)/2 -4 -1 -3

出现这种现象的原因是编译器计算整数除法时是按照绝对值向下取整的规则计算的

3. mid=(L+R)/2可能溢出而mid=L+(R-L)/2 不会溢出

目前C++编译器int型变量大多是4个字节长度,其中首位bit表示符号,则其表示范围为-2147483648 ~ 2147483647[-231 ~231-1]
所以当 L 和 R 很大时mid=(L+R)/2可能溢出,而只要 R 是合法的mid=L+(R-L)/2 必然不会溢出。

两个整数取中间值问题相关推荐

  1. 4:如何实现对两个整数变量的值进行互换。

    package day; public class HomeWork_01 { // 4:如何实现对两个整数变量的值进行互换. public static void main(String[] arg ...

  2. vue中过滤器比较两个数组取相同值

    在vue中需要比较两个数组取相同值 一个大数组一个 小数组,小数组是大数组的一部分取相同ID的不同name值 有两种写法,两个for循环和map写法 const toName = (ids, arr) ...

  3. JAVA取两个整数的中间值,不出现溢出

    取两个整数中间值不溢出 今天用二分写算法的时候发现竟然超时了,后面调试发现原来是2个整数相加溢出变成负数了,记录一下不溢出取中间值的方法 下面是一般取中间值的写法 int m = (low+high) ...

  4. (c语言)求两个整数较大值

    第一步:包含输入输出头文件 #include <stdio.h> 第二步:写出主函数部分 int main() { int a=0,b=0; //定义两个整数并初始化int max=0; ...

  5. java交换两个变量的值_Java中交换两个整数变量的值

    需求 如下,我们定义了两个整数变量,并且分别进行了赋值,下面,我们需要实现的就是将x的值赋值给y,将y值赋值给x,实现x和y的值交换: int x = 100; int y = 200; 方法一:使用 ...

  6. 两个numpy取相同值_闲谈Numpy的切片规则

    我想说在学numpy库的时候切片真的让我有点痛苦的,逗号分号括号数字交织在一起刚开始看的我简直脑袋要爆炸,不过后来静下心来仔细看了看,发现其实也米有这么复杂,毕竟基于python的numpy库也是遵循 ...

  7. mysql同一个表,两个数字取差值

    select s1-s2 from (select time as s1 from info_202104 where id = 117) as table1,(select time as s2 f ...

  8. Java控制流程练习“黄金分割点”:寻找某两个整数相除,其结果离黄金分割点0.618最近 ,分母和分子不能同时为偶数,分母和分子 取值范围在[1-20]

    寻找某两个整数相除,其结果 离黄金分割点 0.618最近 分母和分子不能同时为偶数 分母和分子 取值范围在[1-20] 代码: public class GoldenRatio {public sta ...

  9. 不同符号的两个整数求余和取模的计算技巧(规律)

    文章目录 求余函数和取模函数的区别 x 和 y 符号不同,求余数和模数的技巧 求余的运算规律(技巧) 取模的运算规律(技巧) 求余函数和取模函数的区别 求余函数rem(x,y) 和取模函数 mod(x ...

最新文章

  1. 七、处理机调度概念、层次
  2. c语言的适当大小的子集,编译原理上机实验报告
  3. 乌镇现场·帅初:公有链的未来——链上校验,链下计算
  4. VTK:vtkCaptionActor2D用法实战
  5. Java黑皮书课后题第7章:7.8(求数组的平均值)使用下面的方法头编写两个重载的方法,返回数组的平均数。编写一个测试程序,提示用户输入10个double型值,然后调用这个方法显示平均值
  6. linux nfs系统客户端,Linux系统中挂载共享目录NFS文件系统客户端安装与配置
  7. 如何使用SIOS DataKeeper在AWS EC2中配置较少SANSQL Server群集
  8. micropython logging文档
  9. 高等数学(第七版)同济大学 习题2-4 个人解答
  10. 如何压缩图片大小?这几种图片压缩方法总有一款适合你
  11. ICON源码复现(Implicit Clothed humans Obtained from Normals)
  12. 正宇丨你的不自律,会毁了你一辈子
  13. 电路单位本质与dB家族
  14. 巨头秀区块链肌肉 原生军机会何在?
  15. 《资治通鉴》—— 三家分晋
  16. 用HTML开发Windows桌面应用程序
  17. Web 开发学习笔记——关于互联网和互联网应用
  18. 亚马逊商品图片使用技巧和规范你都了解吗?
  19. Android Jetpack导航组件——Navigation的使用
  20. 论目前最好的中文搜索引擎

热门文章

  1. 上大学时做的linux上视频传输的程序
  2. UE4 如何将材质Material保存为本地图片Png
  3. IDEA如何从本地文件导入jar包
  4. BILSTM原理介绍
  5. 创建56个民族的sql语句
  6. 关于MODIS数据说明及简单处理
  7. 烤仔建工 | 来红浪漫和漂亮姐姐Yanelis K歌吧
  8. (一)java如何产生随机数
  9. Back-off restarting failed container报错
  10. 美国服务器如何抵御黑客攻击