剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)

简介: 剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)

题目描述:

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

数据范围:两个数都满足−10≤n≤1000

进阶:空间复杂度O(1),时间复杂度O(1)

示例:

输入:

1,2


返回值:

3

解题思路:

本题考察位运算。两种解题思路。


1)位运算-非递归


      加法中,对同一位而言,如果都是0则为0,如果有一个1一个0则为1,如果有两个1,则当前位0且有进位1;异或运算^可得到两个数的非进位,与运算&后左移1可得到两个数的进位;非进位和进位再进行一次异或运算和与运算,如果没有出现进位,那就相当于两者完成了相加;若出现了新的进位,则重复上述操作直到进位消失。


2)位运算-递归


      递归运算相当于把while循环以递归形式执行,原理是一致的。

测试代码:

1)位运算-非递归

class Solution {
public:
    int Add(int num1, int num2) {
        // add表示进位值
        int add = num2;         
        // sum表示总和       
        int sum = num1;                
        // 当不再有进位的时候终止循环
        while(add != 0) {              
            // 将每轮的无进位和与进位做异或运算
            int temp = sum ^ add;      
            // 进位通过用与运算左移1产生的
            add = (sum & add) << 1;    
            // 更新
            sum = temp;                
        }
        return sum;
    }
};

2)位运算-递归

class Solution {
public:
    int Add(int num1, int num2) {
        // 递归地求和
        return num2 ? Add(num1 ^ num2, (num1 & num2) << 1) : num1;
    }
};


相关文章
|
1月前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
1月前
|
人工智能 算法 测试技术
【数学】【排序】【C++算法】3027人员站位的方案数
【数学】【排序】【C++算法】3027人员站位的方案数
|
2月前
|
存储 算法 Serverless
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
47 0
|
2月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
109 1
|
2天前
|
存储 算法 C++
算法:位运算
算法:位运算
13 2
|
17天前
|
存储 缓存 算法
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
|
17天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
24天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
1月前
|
人工智能 算法 BI
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接
|
1月前
|
算法 测试技术 C#
【模拟】【C++算法】2826. 将三个组排序
【模拟】【C++算法】2826. 将三个组排序