题目在线测试连接:不用加减乘除做加法_牛客网 (nowcoder.com)
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题解:
加法:a+b
由a^b可得按位相加后没有进位的和;
由a&b可得可以产生进位的地方;
由(a&b)<<1得到进位后的值。
int Add(int num1, int num2)
{
if(!num2) //如果num2为零,即进位为0返回num1
return num1;
else
return Add(num1^num2,(num1&num2)<<1);
//将没有进位的加和, 与进位值再次相加
}
运行时间:4ms 内存:496KB
更优解:我的思路采用递归方式,重复调用自己占用内存大速度慢,可直接将if(!num2)的判断改为while循环,两数两加直到没有进位值停止
int Add(int num1, int num2)
{
int sum1 = num1^num2;
int sum2 = (num1&num2)<<1;
while(sum2){
int temp = sum1^sum2;
sum2 = (sum1&sum2)<<1;
sum1 = temp;
}
return sum1;
}
运行时间:3ms 内存:480KB