题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足 −10≤n≤1000
进阶:空间复杂度 O(1),时间复杂度 O(1)
示例1
输入:1,2
返回值:3
示例2
输入:0,0
返回值:0
思路1:堪称一绝哈哈哈
求2个数的和,不用加减乘除,但是能用++和--,所以可以以0为界,将其中一个数++至0或者--至0,另一个数做相反的操作,就能得到结果。
代码1
public class Solution {
public int Add(int num1,int num2) {
while(num2 != 0){
if(num2 > 0){
num2 --;
num1 ++;
}
if(num2 < 0){
num2 ++;
num1 --;
}
}
return num1;
}
}
思路2
不能用四则运算,那就只能利用位运算进行计算。
两个数二进制位相异或后的结果,是两数相加的结果(不考虑进位)
两个数二进制位相与后左移一位的结果,是两数相加后的结果(只考虑进位)
num1+num2=循环求(本位+进位)的值,直到不再产生进位。
十进制计算:例如 27+85=112
1)对各位只做相加不进位,结果为2;
2)考虑进位,7+5中有进位,进位的值是10;2+8有进位,进位的值是100;
3)将前面的三个结果相加,得到的结果为112。
二进制计算:例如 7+4=11,7的二进制为0111,4的二进制为0100
1)只做相加不进位,相当于异或操作:0111 ^ 0100 = 0011;
2)考虑进位,相当于与操作:0111 & 0100 = 0100,有进位,因此,将结果向前进位,得到1000;
3)因为存在进位,所以将以上得到的两个结果,重复步骤 1)和步骤 2),直到与操作不产生进位,此时步骤 1)得到的结果即为原始的两个数之和。
public class Solution {
public int Add(int num1, int num2) {
while (num2 != 0) {
int temp = num1 ^ num2;
num2 = (num1 & num2) << 1;
num1 = temp;
}
return num1;
}
}