【剑指offer】56.不用加减乘除做加法

总目录:

算法之旅导航目录

 

1.问题描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 
数据范围:两个数都满足10n1000
进阶:空间复杂度 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 };

 

posted @ 2022-12-02 14:20  啊原来是这样呀  阅读(40)  评论(0)    收藏  举报