描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
示例1
输入:1,2
返回值:3
方法一:C++自带累加函数
核心思想:
利用C++自带的函数accumulate,它会计算容器所有元素的和。首先将这两个数据放入容器中,然后使用该函数进行计算。
核心代码:
int Add(int num1, int num2){ vector<int> v = {num1,num2}; return accumulate(v.begin(),v.end(),0); }
复杂度分析:
C++里面的accumulate函数是累计容器中的所以的值,由于引入容器中的元素为常量,因此时间复杂度为O(1)。由于引入的额外数组大小为常量,因此空间复杂度也为O(1)
时间复杂度O(1)
空间复杂度O(1)
方法二:移位异或运算
核心思想:
利用异或、与和移位运算。首先可以简单的回顾一下基本运算操作关系。
与运算(&):0&0=0;0&1=0;1&0=0; 1&1=1;
或运算(|): 0|0=0;0|1=1;1|0=1;1|1=1;
或运算(^):0^0=0;0^1=1;1^0=1;1^1=0;
1)两个数做^运算,得到各位相加不进位的计算结果
2)两个数做&运算,得到进位。因为进位是要加到左一位的,所以需要左移1
3)将操作后的数据相加即可
图解:
举例:
5+7 = 12
核心代码:
int Add(int num1, int num2) { int sum = num1 ^ num2, c = (num1 & num2) << 1; return sum + c; }
复杂度分析:
直接求值发,一次执行即可,因此时间复杂度为O(1)。由于没有引入额外的数组,因此空间复杂度也为O(1)
时间复杂度O(1)
空间复杂度O(1)