本篇文章为你整理了每日算法之不用加减乘除做加法(不用加减实现加法)的详细内容,包含有不用加减乘除做除法 不用加减实现加法 不用加法实现加法 不使用加减乘除求两数和 每日算法之不用加减乘除做加法,希望能帮助你了解 每日算法之不用加减乘除做加法。
数据范围:两个数都满足 -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;
以上就是每日算法之不用加减乘除做加法(不用加减实现加法)的详细内容,想要了解更多 每日算法之不用加减乘除做加法的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。