不使用算术运算符(+/-)怎么求两数之和?
今天遇到了这样一个题
题目说了不能用算数运算符,那么我们就只能从 逻辑运算符 和 移位运算符 入手了。
我们知道 ^ (异或)操作是对两个数进行无进位求和,如果两个数相加本来就不产生进位,那么该和就是两数之和。 这就是解题的关键所在。
一般来说,两数相加是会产生进位的,而要得到正确的和,应该是在 “无进位之和” 的基础上加上进位,那我们首先应该得到进位。
我们知道,当两个数对应位置都为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次,没有一次出错,说明该函数可靠。
不使用算术运算符(+/-)怎么求两数之和?相关推荐
- python的return语句求两数之和_程序题(python解)
PyCharm整理代码:Ctrl+Alt+l list行数:len(list) list列数:len(list[1]) 笔试常使用到的功能: 1.单独取出一长串字符中每个单独的字符: 输入'abcd' ...
- leetCode刷题第一天--求两数之和
两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...
- 求两数之和(三种解法)
给定一个升序排列的整数数组numbers ,从数组中找出两个数满足相加之和等于目标数 target. 假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素. 返回两数的下标值,以数组形式返回 i ...
- python的return语句求两数之和_Python的return语句可以返回多个不同类型的值
[多选题]体内能源的储存方式有 [简答题]简述降低大体积水化热温升,减少水泥用量应采取哪些措施? [多选题]与体温的正常变动有关的因素有 [单选题]某公司短期借款利息采取月末预提的方式核算,则下列预提 ...
- python求两数之和的命令_数学建模:科学计算Python2小时-Python基础
这一部分主要面向数模活动中的python基础知识进行讨论 作者 系列文章(科学计算Python2小时)目录:李似:科学计算Python2小时-前言与目录zhuanlan.zhihu.com 首先要说 ...
- python用链表求两数之和_python 算法 - 008 计算两个链表所代表的整数之和 (整数相加法)...
python 算法 - 008 计算两个链表所代表的整数之和 (整数相加法) 知之者不如好之者, 好之者不如乐之者.--<雍也> 知道德者不如好道德者, 好道德者不如乐道德者, 是为形容人 ...
- python求两数之和的命令_python计算两个数的百分比方法
工作中遇到了要计算两个数百分比的问题,python 2.7 环境. 代码: #!/usr/bin/env python #function: 计算百分比 #USAGE: python calculat ...
- 【c语言】求两数之和
#include<stdio.h>void main() //void表示程序无返回值:{int x,y,sum;x=1900;y=100;sum=x+y;printf("The ...
- python求两数之和的命令_python实现读取命令行参数的方法
本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块 ...
最新文章
- 多线程:了解一下ForkJoin、FutureTask、BlockingQueue
- nyist -- 组队赛(二)
- 【原创】最值得推荐wince应用和wince驱动入门书籍
- Android 获得ImageView中Image的绘制大小
- Pandas时序数据处理入门
- Java:应用Observer接口实现Observer模式
- mysql查询每个用户第一条数据_MySQL数据库订单表按用户邮箱字段分组查询每个用户的第一条记录...
- 消息总线扩展之集成Thrift-RPC
- .Net Core下使用 RSA
- [FFmpeg] 在 ffplay 源码中嵌入 YOLO 算法实现实时物体检测
- Linux:UDP Socket编程(代码实战)
- Zookeeper可以干什么
- 计算机键盘重复设置,电脑键盘错乱怎么恢复 一键快速重新设置电脑快捷键方法...
- 外盘持仓盈亏何时推送---ITapTradeAPINotify::OnRtnPositionProfit
- cookie与session区别
- mysql中sum和count的区别
- FFplay退出分析
- java实现老鼠出迷宫
- 【PHP MySQL】数据库专题 第二课 创建数据库 表
- 知识库平台功能结构分析
热门文章
- Altium Designer20 PCB设计基础知识
- 测水位,六种传感器都知道,算你牛!
- 外贸独立站的全方位运营指南:从定位到转化的完整解决方案
- DriverDrowsiness_Detection fatigue
- 小程序对火锅店的发展利好及部分可行性内容设计
- 颜值与性能齐飞,苏宁小Biu智能摄像头评测
- 数理在线计算机,计算机数理演算系统的演示分析
- DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
- gis如何加入emf图片_投票 | Ansys仿真的艺术图片大赛入围作品巡展
- KNN实现海伦约会预测