今天遇到了这样一个题

题目说了不能用算数运算符,那么我们就只能从 逻辑运算符移位运算符 入手了。

我们知道 ^ (异或)操作是对两个数进行无进位求和,如果两个数相加本来就不产生进位,那么该和就是两数之和。 这就是解题的关键所在。
一般来说,两数相加是会产生进位的,而要得到正确的和,应该是在 “无进位之和” 的基础上加上进位,那我们首先应该得到进位。
我们知道,当两个数对应位置都为1的情况下,才会有进位的产生,即对应位置 A&B==1的条件下,就可以得到每一位的进位,但是进位是将这个1加到对应的更高一位,所以我们将得到的进位整体进行左移一位,再和之前得到的 “无进位之和” 相加,就可以得到两数之和。

我们发现这里就可以无限套娃了,要得到 “无进位之和” 和 “产生的进位” 之和,那么将这两个数再分别看做新的两个数,对其求和。也是重复之前的操作,直到两数不能产生进位,就可以直接通过 ^ 运算得到结果。

假设我们求 23 + 16 的值


根据上述思路,我们很容易就可以写出代码

public static int addAB(int A, int B) {// 当两数的产生的进位为 0,就退出循环,返回其无进位和,就是结果while ((A & B) != 0) {int A_B = A ^ B;// 无进位求和int AB = (A & B) << 1;// 得到进位// 接下来就是求 得到的进位 + 无进位之和,重复前面的操作,直到不产生进位A = A_B;B = AB;}// 最后返回新的无进位之和return (A ^ B);}

那么为了验证它的正确性,我们这里使用对数器,将该函数与 ’ + ’ 运算符比较。

public static void main(String[] args) {int count = 1_0000_0000;// 比较次数 100000000次Random random = new Random();// 生成随机数字boolean flag = true;// 相等则为 truefor (int i = 0; i < count; i++) {int num1 = random.nextInt(Integer.MAX_VALUE/2);// 随机正数1int num1_2 = random.nextInt(Integer.MAX_VALUE/2);// 随机正数2// 随机正数1 + 随机正数2if ((num1+num1_2) != addAB(num1,num1_2)){// 有一次不相等的,则退出循环flag = false;break;}int num2 = -random.nextInt(Integer.MAX_VALUE/2);// 随机负数1int num2_2 = -random.nextInt(Integer.MAX_VALUE/2);// 随机负数2// 随机负数1  + 随机负数2if ((num2+num2_2) != addAB(num2,num2_2)){// 有一次不相等的,则退出循环flag = false;break;}int num3 = random.nextInt(Integer.MAX_VALUE);// 随机正数int num4 = -random.nextInt(Integer.MAX_VALUE);// 随机负数// 随机正数  + 随机负数if ((num3+num4) != addAB(num3,num4)){// 有一次不相等的,则退出循环flag = false;break;}}System.out.println(flag);
}

运行结果:

最后输出结果为 true ,说明我们计算随机产生的 正数+正数、负数+负数、正数+负数 分别100000000次,没有一次出错,说明该函数可靠。

不使用算术运算符(+/-)怎么求两数之和?相关推荐

  1. python的return语句求两数之和_程序题(python解)

    PyCharm整理代码:Ctrl+Alt+l list行数:len(list) list列数:len(list[1]) 笔试常使用到的功能: 1.单独取出一长串字符中每个单独的字符: 输入'abcd' ...

  2. leetCode刷题第一天--求两数之和

    两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...

  3. 求两数之和(三种解法)

    给定一个升序排列的整数数组numbers ,从数组中找出两个数满足相加之和等于目标数 target. 假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素. 返回两数的下标值,以数组形式返回 i ...

  4. python的return语句求两数之和_Python的return语句可以返回多个不同类型的值

    [多选题]体内能源的储存方式有 [简答题]简述降低大体积水化热温升,减少水泥用量应采取哪些措施? [多选题]与体温的正常变动有关的因素有 [单选题]某公司短期借款利息采取月末预提的方式核算,则下列预提 ...

  5. python求两数之和的命令_数学建模:科学计算Python2小时-Python基础

    这一部分主要面向数模活动中的python基础知识进行讨论 作者 系列文章(科学计算Python2小时)目录:李似:科学计算Python2小时-前言与目录​zhuanlan.zhihu.com 首先要说 ...

  6. python用链表求两数之和_python 算法 - 008 计算两个链表所代表的整数之和 (整数相加法)...

    python 算法 - 008 计算两个链表所代表的整数之和 (整数相加法) 知之者不如好之者, 好之者不如乐之者.--<雍也> 知道德者不如好道德者, 好道德者不如乐道德者, 是为形容人 ...

  7. python求两数之和的命令_python计算两个数的百分比方法

    工作中遇到了要计算两个数百分比的问题,python 2.7 环境. 代码: #!/usr/bin/env python #function: 计算百分比 #USAGE: python calculat ...

  8. 【c语言】求两数之和

    #include<stdio.h>void main() //void表示程序无返回值:{int x,y,sum;x=1900;y=100;sum=x+y;printf("The ...

  9. python求两数之和的命令_python实现读取命令行参数的方法

    本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块 ...

最新文章

  1. 多线程:了解一下ForkJoin、FutureTask、BlockingQueue
  2. nyist -- 组队赛(二)
  3. 【原创】最值得推荐wince应用和wince驱动入门书籍
  4. Android 获得ImageView中Image的绘制大小
  5. Pandas时序数据处理入门
  6. Java:应用Observer接口实现Observer模式
  7. mysql查询每个用户第一条数据_MySQL数据库订单表按用户邮箱字段分组查询每个用户的第一条记录...
  8. 消息总线扩展之集成Thrift-RPC
  9. .Net Core下使用 RSA
  10. [FFmpeg] 在 ffplay 源码中嵌入 YOLO 算法实现实时物体检测
  11. Linux:UDP Socket编程(代码实战)
  12. Zookeeper可以干什么
  13. 计算机键盘重复设置,电脑键盘错乱怎么恢复 一键快速重新设置电脑快捷键方法...
  14. 外盘持仓盈亏何时推送---ITapTradeAPINotify::OnRtnPositionProfit
  15. cookie与session区别
  16. mysql中sum和count的区别
  17. FFplay退出分析
  18. java实现老鼠出迷宫
  19. 【PHP MySQL】数据库专题 第二课 创建数据库 表
  20. 知识库平台功能结构分析

热门文章

  1. Altium Designer20 PCB设计基础知识
  2. 测水位,六种传感器都知道,算你牛!
  3. 外贸独立站的全方位运营指南:从定位到转化的完整解决方案
  4. DriverDrowsiness_Detection fatigue
  5. 小程序对火锅店的发展利好及部分可行性内容设计
  6. 颜值与性能齐飞,苏宁小Biu智能摄像头评测
  7. 数理在线计算机,计算机数理演算系统的演示分析
  8. DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
  9. gis如何加入emf图片_投票 | Ansys仿真的艺术图片大赛入围作品巡展
  10. KNN实现海伦约会预测