跟着姚桑学算法-不用加减乘除做加法

简介: 剑指offer算法

题. 不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、×、÷ 四则运算符号。

数据范围
−1000≤num1,num2≤1000

样例

输入:num1 = 1 , num2 = 2

输出:3

【题解】--- 模拟加法器

不使用加减乘除来进行加法运算,尝试可以模拟计算机的加法器实现。

举个例子:14+8
14的二进制表示:1110
8的二进制表示:1000

我们将整个运算分为 1. 进位 2.不进位

  • 第一步进行不进位的运算:

十进制来看:十位为1+0=1,个位为4+8=2 结果为12

二进制来看: 1110+1000=0110 (不进位) 结果为0110

  • 第二步进行进位的运算:

十进制来看:只有个位上的4+8进位1得到10 结果为10

二进制来看:1110+1000=10000 (只注意进位) 结果为10000

  • 第三步将进位与不进位的结果相加:

十进制结果:12+10=22

二进制结果:10000+0110=10110 ==十进制下的22

  • 至此完成了加法运算。

观察上面的计算过程:

二进制不进位的运算结果与 异或 运算结果相同

二进制进位的运算结果与各位 相与& 后左移一位的结果相同

  • 因此我们可以通过与运算与异或运算来实现加法运算

1.计算俩个数不算进位的结果(num1^num2)

2.计算两个数算进位的结果 (num1&num2)<<1

3.将两个结果相加.我们发现又要用到加法运算,那么其实我们重复上述步骤就行了,直到一个数变为0(不再进位)运算全部完成

复杂度分析:

奇思妙解复杂度为O(1)。

C++代码实现:

class Solution{
    public:
        int add(int num1,int num2){
            while(num2){
                int x=num1^num2;
                int y=(num1&num2)<<1;
                num1=x;
                num2=y;
            }
            return num1;
        }
}
目录
相关文章
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
|
算法 C++
【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算
【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算
173 0
|
算法 C++ Python
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
132 0
|
存储 算法 大数据
基础算法-高精度加法
为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
|
存储 人工智能 算法
【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)2
【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)
119 0
【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)2
|
存储 人工智能 算法
【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)
【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)
304 0
【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)
|
存储 算法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
148 0
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
|
算法
OC NSDecimalNumber链式加减乘除算法
OC NSDecimalNumber链式加减乘除算法
109 0
OC NSDecimalNumber链式加减乘除算法
|
算法 Swift
swift NSDecimalNumber链式加减乘除算法
swift NSDecimalNumber链式加减乘除算法
189 0
swift NSDecimalNumber链式加减乘除算法