zoukankan      html  css  js  c++  java
  • Leetcode 371

    我们先用最朴素的方法来思考这道题,那就是逐位进行运算。

    bit[i] = a[i] + b[i] + carry[i]

    if a[i] + b[i] + carry[i] >= 10: carry[i+1] = 1

    但是我们不能使用加法,也没有加法器元件,因此我们只能自己来总结规律。

    0 + 0 = 0

    1 + 0 = 1

    0 + 1 = 1

    1 + 1 = 10

    可以看到本位的运算结果是 a ^ b,而进位的运算结果是 a & b << 1

    那么刚刚的算法就可以拆分为:

    bit[i] = a[i] ^ b[i]

    tempcarry[i+1] = a[i] & b[i] << 1

    bit[i] = carry[i] ^ bit[i]

    tempcarry[i+1] = tempcarry[i+1] | (carry[i] & bit[i] << 1) // 这一步必然不可能会发生进一步的进位,所以是取或

    ---

    carry = tempcarry

    但是这样很复杂,我们可以试着去分离一下:我们不需要逐位地去进行 a + b + carry 的操作,而是先计算 c = a ^ b,然后计算 carry = a & b << 1,最后计算 c + carry,以此类推,直到carry没有为止。

    这样就得到了:

    return b == 0 ? a : getSum(a ^ b, (a & b) << 1);

  • 相关阅读:
    软件测试面试题(一)
    测试面试题
    测试
    测试理论
    软件测试的认识
    理论知识
    H5页面的测试方式
    mysql数据库,linux,面试理论等
    登录设计点
    ATM境外取款测试点
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/15336622.html
Copyright © 2011-2022 走看看