【Golang】LeetCode-剑指Offer-面试题65-不用加减乘除做加法【三种解法】

题目

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

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

提示:
a, b 均可能是负数或 0 结果不会溢出 32 位整数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof


解法一:二进制计算—异或与

  • ^ 异或
    • 相当于无进位的求和
    • 如:19+1=20;无进位求和就是10,而非20。
  • & 与
    • 相当于求每位的进位数
    • & 的定义:1&1=1;1&0=0;0&0=0;即都为1的时候才为 1,其他情况为 0
    • 正好可以模拟进位数的情况:
    • 如 9+1=10,如果是用&的思路来处理,则9+1得到的进位数为1,而不是10;
    • 所以要用<<1向左再移动一位,这样就变为10了。

这样公式就是:(a^b) + ((a&b)<<1) 即:每次无进位求和 + 每次得到的进位数

  • 计算a+b,等价于 (a^b) + ((a&b)<<1)
    • 由于公式中又出现了 + 号,因此要再重复这个等价的计算过程。
    • 结束条件是:没有进位了( 进位数为 0 )。

代码

–执行用时:0 ms --内存消耗:2 MB

func add(a int, b int) int {
    if b==0{
        return a
    }
    return add((a^b),(a&b)<<1)
}

解法二:math/big包

–执行用时:0 ms --内存消耗:2.1 MB

func add(a int, b int) int {
    x:=big.NewInt(int64(a))
    y:=big.NewInt(int64(b))
    x.Add(x,y)
    return int(x.Int64())
}

解法三:atomic包

–执行用时:0 ms --内存消耗:1.9 MB

func add(a int, b int) int {
    a64,b64:=int64(a),int64(b)
    return int(atomic.AddInt64(&a64,b64))
}

你可能感兴趣的:(LeetCode力扣个人题解)