zoukankan      html  css  js  c++  java
  • 371. Sum of Two Integers

    不用加减法计算两个整数的和。这道题其实是考察一些基本的布尔代数知识。我们知道,二进制表示时:
    0 + 0 = 00
    1 + 0 = 01
    0 + 1 = 01
    1 + 1 = 10

    所以,两个二进制整数 ab,如果相加的过程中如果没有进位,那么 a+b=ab,这里 表示异或。那么 a+b 的进位为多少呢,只有 1+1 时才会出现进位。所以 a+b 的进位可以表示为 2×(a & b),这里 & 表示两个数字的按位与运算。之所以要乘以 2,是因为要向上进一位。

    所以有如下关系:
    如果 a,b 时任意的二进制整数。

    x0=abc0=2×(a & b)


    那么有

    a+b=x0+c0


    并且c0 的最低位为 0
    这个过程再进行一遍:

    x1=x0c0c1=2×(x0 & c0)


    那么有:

    a+b=x0+c0=x1+c1


    并且 c1 的最后两位都是 0。 这样进行 N 此后,cN 的后 N+1 就都是 0 了。
    那么,只要 a,b 是有限位的整数,那么必然可以经过有限次(M次)的这种变换,使得 cM0。这时:

    a+b=cM+xM=xM

    这个过程很容易写成递归程序:

    int getSum(int a, int b)
    {
        if(a == 0) return b;
    
        int x = a ^ b;
        int c = (a & b) << 1;
        return getSum(c, x);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当然,也可以用也可以不用递归:

    int getSum2(int a, int b)
    {
        while(a)
        {
            int x = a ^ b;
            a = (a & b) << 1;
            b = x;
        }
        return b;
    }
  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/UnGeek/p/5802788.html
Copyright © 2011-2022 走看看