剑指 Offer 65. 不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
解答
class Solution {
/**
本位和n = a 异或 b
进位c = (a 与 b)左移一位
和s = a + b = 本位和(n) + 进位(c)
因为不能用加法,所以n + c 又用上面的方法算(递归),
直到进位c为0,本位和 + 进位就等于 本为和
因为进位c是通过不断地左移和与得到的,左移之后最后一位肯定是0,再与最后一位肯定还是0,
然后再左移,0肯定是不断增加的,所以进位c肯定会变为0,所以通过判断它是否为0来结束递归
*/
// 非递归实现
/*
public int add(int a, int b) {
int sum=a^b;
int carry=(a&b)<<1;
System.out.println("sum:"+sum+" carry:"+carry);
while(carry!=0){
System.out.println("sum:"+sum+" carry:"+carry);
a=sum;
b=carry;
sum=a^b;
carry=(a&b)<<1;
}
return sum;
}
*/
//递归实现
public int add(int a,int b){
if(b == 0){
return a;
}
int sum = a^b;
int carry = (a&b) << 1;
return add(sum,carry);
}
}