题解 | #不用加减乘除做加法#
不用加减乘除做加法
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; } };