题解 | #不用加减乘除做加法#
不用加减乘除做加法
http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215
题目难度:简单
题目考察:位运算
题目内容:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题目分析:
这题正解肯定是位运算,但是其实有个巧妙的做法,stl里有可以直接调用函数对vector内数求和,所以可以直接把a,b放进vector内求和即可,代码如下
思路1(stl)
class Solution {
public:
int Add(int num1, int num2) {
vector<int>a;
a.push_back(num1);
a.push_back(num2);
//放进num1,num2
return accumulate(a.begin(),a.end(),0);
//直接调用求和函数
}
};思路2:位运算
异或运算有另一个名字叫不进位的加法,啥意思呢,0^1=1,1^0=1,0^0=0,1^1=0,前三个和加法是一样的结果,后一个在二进制下当前位也是0,但是高位要加1,所以说异或在当前不考虑进位的情况下和加法一样
但是这和本题有啥关系呢,上面说到异或和加法的区别是1^1加法要进位,只要解决了这个问题就能完成加法,下面给出方法
下面给出代码
class Solution {
public:
int Add(int num1, int num2) {
while (num2) {
//当num2==0,num1&num2==0所以答案就是num1^num2
int temp = num1^num2;
num2 = (num1&num2)<<1;
num1 = temp;
//三变量交换法重新给num1,num2赋值
}
return num1;
}
};
查看1道真题和解析