【剑指offer】56.不用加减乘除做加法
总目录:
1.问题描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 
数据范围:两个数都满足−10≤n≤1000
进阶:空间复杂度 O(1),时间复杂度O(1)
进阶:空间复杂度 O(1),时间复杂度O(1)
2.问题分析
基本认知:异或运算、与运算
异或运算能够得到忽略进位时的和A,与运算能够获得相加时哪些位将产生进位、再左移一位即得到进位产生的值B,
继续对A和B进行异或、与运算,产生新的A和B,直到B为0也就是不再有需要进位的值。
1迭代
2递归
3.代码实例
迭代
1 class Solution { 2 public: 3 int Add(int num1, int num2) { 4 int orSum = num1; 5 int andSum = num2; 6 int temp = 0; 7 8 while (andSum != 0) { 9 //暂存当前的累加和,后面与运算用 10 temp = orSum; 11 12 //获取不进位后的和 13 orSum = orSum ^ andSum; 14 15 //与运算获得哪些位要进位,再左移1位才是要进位的值 16 andSum = (temp & andSum) << 1; 17 } 18 19 return orSum; 20 } 21 };
递归
1 class Solution { 2 public: 3 int Add(int num1, int num2) { 4 // 递归地求和,也是判断是否有进位值,此时进位值用num2来表示,每轮的结果都存储在num1中 5 return num2 ? Add(num1 ^ num2, (num1 & num2) << 1) : num1; 6 } 7 };
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号