每日一题 - 剑指 Offer 65. 不用加减乘除做加法

本文介绍了一种利用位运算实现两个整数相加的方法,避免使用传统的加减乘除运算符。通过分析二进制位上的加法规律,采用异或和与运算,实现了高效的加法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日一题 - 剑指 Offer 65. 不用加减乘除做加法

题目信息

  • 时间: 2019-07-07

  • 题目链接:Leetcode

  • tag: 位运算 限制运算符号

  • 难易程度:中等

  • 题目描述:

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

示例1:

输入: a = 1, b = 1
输出: 2

注意

1. a, b 均可能是负数或 0
2. 结果不会溢出 32 位整数

解题思路

本题难点

求和不使用 “+”、“-”、“*”、“/” 四则运算符号。

具体思路

位运算

设两数字的二进制形式 a,b ,其求和 s=a+b ,a(i) 代表 a 的二进制第 i 位,则分为以下四种情况:

a(i)b(i)无进位和n(i)进位和c(i)
0000
0110
1010
1101

无进位和异或运算 规律相同

进位与运算 规律相同(并需左移一位)

即可将 s = a+b 转化为: s = 非进位和 n + 进位 c

循环求 n和 c ,直至进位 c=0;此时 s=n,返回 n即可。

提示

代码

class Solution {
    public int add(int a, int b) {
        int c = 0;
        while(b != 0){
            c = (a & b) << 1;
            a ^= b;
            b = c;
        }
        return a;
    }
}

复杂度分析:

  • 时间复杂度 O(1) : 最差情况下(例如 a= 0x7fffffff , b=1 时),需循环 31 次,使用 O(1) 时间;每轮中的常数次位操作使用 O(1) 时间。
  • 空间复杂度 O(1) : 使用常数大小的额外空间。

其他优秀解答

解题思路

递归法,把a+b转换成非进位和+进位,由于不能用加法,因此要一直转换直到第二个加数变成0。

代码

class Solution {
    public int add(int a, int b) {
        if (b == 0) {
            return a;
        }
        // 转换成非进位和 + 进位
        return add(a ^ b, (a & b) << 1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值