剑指offer系列——剑指 Offer 65. 不用加减乘除做加法

举报
未见花闻 发表于 2022/04/30 00:27:40 2022/04/30
【摘要】 剑指offer系列——剑指 Offer 65. 不用加减乘除做加法

⭐️前面的话⭐️

大家好!本篇文章将介绍的剑指offerOJ题,来自力扣剑指 Offer 65. 不用加减乘除做加法题解,展示代码语言暂时为:Java,C,C++。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆华为云首发时间:🌴2022年4月30日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《C语言程序设计》📚《剑指offer》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


⭐️剑指 Offer 65. 不用加减乘除做加法⭐️

🔐题目详情

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

示例:

输入: a = 1, b = 1
输出: 2
输入: a = 5, b = 6
输出: 11

提示:

  1. a, b 均可能是负数或 0。
  2. 结果不会溢出 32 位整数。
来源:力扣(LeetCode)链接:剑指 Offer 65. 不用加减乘除做加法

💡解题思路

方法1:你说不能使用加减乘除运算符?我偏要用,直接将两数相加返回。

方法2:位运算。

预备知识:

  • [x] 按位与 & :双目运算符,对每位取与,都为1则为1,否则为0。
  • [x] 按位异或 ^ :双目运算符,对每位取异或,对应位两数不相同为1,否则为0。
  • [x] 左移 << :双目运算符,a << b ,表示将a的二进制位左移b位,最右边补0。
  • [x] 加法进位的特点:对于二进制,发生进位的条件是两个数所对应的二进制位均为1。

解题思路:
1

2

实现a,b两数完整加法的步骤:

  1. 将a与b按位与并左移一位,即(a & b) << 1,不妨将此结果存至变量tmp,若此数值为0,就表示两数未发生进位。
  2. 将a与b进行非进位加法,即a ^ b,不妨将此结果赋值给a,将上面所得tmp值赋值给b。
  3. 此时b的值为tmp,判断b是否为0,若b不为0,需要进位,重复上述步骤,将进位数b与前一次非进位加法的值非进位相加,若b为0,不需要进位,加法过程结束,最终结果即a的值。

注意:C/C++对负数左移存在溢出,先将 a & b 强转为 unsigned int 以保护左移溢出的情况!

3

🔑源代码

Java:

class Solution {
    public int getSum(int a, int b) {
        //两数异或相当于不进位相加,两数按位与运算能够得到需要进位的数,将此数左移再异或相加,直到该数为0,加法计算完毕
        while (b != 0) {
            int tmp = (a & b) << 1;
            a ^= b;
            b = tmp;
        }
        return a;
    }
}

C:

int getSum(int a, int b){
    while (b) {
        int tmp = (unsigned int)(a & b) << 1;//C/C++,负数情况,对有符号数左移存在溢出,先转无符号再左移对溢出情况保护处理
        a ^= b;
        b = tmp;
    }
    return a;
}

C++:

class Solution {
public:
    int getSum(int a, int b) {
        while (b) {
            int tmp = (unsigned int)(a & b) << 1;
            a ^= b;
            b = tmp;
        }
        return a;
    }
};

🌱总结

不用加减乘除做加法,最容易想到的方法就是位运算,通过了解各种位运算的特点,找出模拟加法的适当方法。
力扣同源题:
371. 两整数之和
面试题 17.01. 不用加号的加法
力扣类似题:
面试题 08.05. 递归乘法
29. 两数相除
50. Pow(x, n)
69. Sqrt(x)
面试题 16.07. 最大数值

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。