-
每日算法之不用加减乘除做加法
JZ65不用加减乘除做加法
描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足 -10 \le n \le 1000−10≤n≤1000
进阶:空间复杂度 O(1)O(1),时间复杂度 O(1)O(1)
方法一:位运算非递归(推荐使用)
思路:
由于题目禁止我们使用+,-,*,/运算符,我们需要通过位运算来实现加法。我们需要通过循环迭代两个变量实现,一个变量指代进位,一个变量指代非进位。
位运算中两数进行异或运算可以提供两数加和后二进制非进位信息,位运算中的两数进行与运算的结果可以提供两数加和后的二进制进位信息。因此我们将两数与运算的结果进行循环左移一位,并在下一轮循环中继续将移位后的进位结果和非进位结果求和,重复此过程,直到不再产生进位为止。
具体做法:
step 1:两数进行与运算可以产生进位的信息
step 2:运算后执行左移1位就是每轮需要进位的方案
step 3:两数进行异或运算可以产生非进位的加和结果
step 4:将移位后的进位结果与非进位结果继续重复 step 1 - step 3 的步骤,直到不再产生进位为止
代码
int add = num2;
int sum = num1;
while (add != 0) {
int temp = sum ^ add;
add = (sum & add) << 1;
sum = temp;
}
return sum;
方法二:位运算递归(扩展思路)
思路:
在递归中我们让num2承载进位信息,让num1承载加和信息,进行递归。
具体做法:
step 1:以num2承接是否有进位的工作,num1作为加和的结果
step 2:首先判断num2是否有进位
step 3:如果有进位则递归调用函数,并将num1更新为或运算的结果,num2更新为与运算左移一位的结果
step 4:如果无进位则返回num1,因为num1一直在记录加和结果
代码
package esay.JZ65不用加减乘除做加法;
public class Solution {
public int Add(int num1,int num2) {
//1、方法1
/*int add = num2;
int sum = num1;
while (add != 0) {
int temp = sum ^ add;
add = (sum & add) << 1;
sum = temp;
}
return sum;*/
//2、方法2
return num2 != 0 ? Add(num1 ^ num2, (num1 & num2) << 1) : num1;
}
}
出处:https://www.cnblogs.com/loongnuts/p/16887969.html
栏目列表
最新更新
一个超经典 WinForm 卡死问题的再反思
C# 计算不规则多边形的相交/包含等关系
.NET Core 引发的异常:“sqlsugar.sqlsugarexcep
快速创建软件安装包-ClickOnce
nuget打包静态资源的问题
要写文档了,emmm,先写个文档工具吧——
乘风破浪,遇见最佳跨平台跨终端框架
【Windows版本控制】上海道宁为您提供Vi
available 处理办法
Visual Studio自定义背景图片
三大常用数据库事务详解之三:事务运行
三大常用关系型数据库事务详解之二:基
三大关系型数据库事务详解之一:基本概
MongoDB常用命令(2)
MongoDB基本介绍与安装(1)
SQLServer触发器调用JavaWeb接口
SQL Server索引的原理深入解析
SqlServer2016模糊匹配的三种方式及效率问题
SQL中Truncate的用法
sqlserver 多表关联时在where语句中慎用tri
在vscode中使用R时,用快捷键来快捷键入卡
VB.NET中如何快速访问注册表
ASP.NET中图象处理过程详解
Vue(1)Vue安装与使用
JavaScript 语言入门
js将一段字符串的首字母转成大写
纯原生html编写的h5视频播放器
H5仿原生app短信验证码vue2.0组件附源码地
TypeScript(4)接口
TypeScript(3)基础类型