LeetCode 第 371 题 (Sum of Two Integers)

LeetCode 第 371 题 (Sum of Two Integers)

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:

Given a = 1 and b = 2, return 3.

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

0 + 0 = 00

1 + 0 = 01

0 + 1 = 01

1 + 1 = 10

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

所以有如下关系:

如果 a,b 时任意的二进制整数。

x0=a?bc0=2×(a & b)

那么有

a+b=x0+c0

并且c0 的最低位为 0。

这个过程再进行一遍:

x1=x0?c0c1=2×(x0 & c0)

那么有:

a+b=x0+c0=x1+c1

并且 c1 的最后两位都是 0。 这样进行 N 此后,cN 的后 N+1 就都是 0 了。

那么,只要 a,b 是有限位的整数,那么必然可以经过有限次(M次)的这种变换,使得 cM 为 0。这时:

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);
}

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

int getSum2(int a, int b)
{
    while(a)
    {
        int x = a ^ b;
        a = (a & b) << 1;
        b = x;
    }
    return b;
}
时间: 2024-10-13 02:02:49

LeetCode 第 371 题 (Sum of Two Integers)的相关文章

【LeetCode每天一题】Divide Two Integers(两整数相除)

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator. Return the quotient after dividing dividend by divisor. The integer division should truncate toward zero. Example 1:             Inp

通过位运算求两个数的和(求解leetcode:371. Sum of Two Integers)

昨天在leetcode做题的时候做到了371,原题是这样的: 371. Sum of Two Integers Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 因为之前完全没有在实际练习中使用过位运算,所以刚看到这道题目的时候我的第一反应是 1.用乘除代替加减,但是一想,

【leetcode】371. Sum of Two Integers

题目描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. 解题分析: 这种类型的题必然要用位运算,虽然自己写了关于位运算的代码,但是不够简洁. 后来参考了这篇博文: http://blog.csdn.net/zhongjiekangping/article/details/6855864 这篇博文对位运算加法的实现讲的得十分清楚,我这里就只放按此思路写

[leetcode] 371. Sum of Two Integers 解题报告

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example:Given a = 1 and b = 2, return 3. 用 异或 表示sum,与 表示 carry,carry左移一位后,递归调用getSum(sum,carry<<1) 一刷: public int getSum(int a, int b) { return b ==0 ? a

LeetCode 371 Sum of Two Integers

This problem is a little confusing to me at first. But after I read some articles online, I got to know that it requires bitwise operations. So basically, we need to use "^" to calculate the sum of two integers, and "&" << 1

Leetcode 371. Sum of Two Integers JAVA语言

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 题意:计算a+b,但是不许使用+和- public class Solution {     public int getSum(int a, int b) {         //第一种         while(a!=

LeetCode: 371 Sum of Two Integers(easy)

题目: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example:Given a = 1 and b = 2, return 3. 代码: 使用移位来计算,用异或求不带进位的和,用与并左移1位来算进位,然后将两者相加. 1 class Solution { 2 public: 3 int getSum(int a, int b) { 4 retur

Leetcode 371: Sum of Two Integers(使用位运算实现)

题目是:Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. 思路:两个数的加法分为两步,对应位相加和进位. 举个简单的例子:997+24 我们平时计算时是将对应位相加和进位同时计算,其实可以保留下进位,只计算对应位相加,保留进位的位置(值).接下来,将进位向左移动一位,将上一步的结果与移位后的进位值进行对应位相加,直到没有进位结束. 对于二进制数的而言,对应

[LeetCode] Sum of Two Integers 两数之和

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. Credits:Special thanks to @fujiaozhu for adding this problem and creating all test cases. 这道题是CareerCup上的一道原题,难道