Leetcode371

Leetcode371:两整数之和

题目描述

       不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:

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

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

解法一:基于递归和二进制异或的方法

/****************************************************************************************
基于递归和二进制异或的方法
利用二进制位进行运算。分两步:

不考虑进位进行相加
加上进位,直到进位为0
sum = a ^ b,得到无进位和。
a & b,得到进位,因为是进位,所以左移一位进行相加。考虑到无符号溢出问题,所以转为无符号数。
注意:最小负数左移溢出,所以转为无符号数
*****************************************************************************************/
class Solution {
public:
    int getSum(int a, int b) {  //假设a=3,b=5
        int sum, c;
        sum = a ^ b;   //3^5=0000 0011 ^ 0000 0101 = 0000 0110
        c = ((unsigned int)(a & b)) << 1; //3&5=0000 0011 & 0000 0101 = 0000 0001  再左移一位为0000 0010
        if (c != 0) {
            return getSum(sum, c);
        }
        return sum;
    }
};

解法二:基于迭代和二进制异或的方法

class Solution2 {
public:
    int getSum(int a, int b) {
        while (b != 0) {
            int c = a & b;
            a = a ^ b;
            b = (unsigned int)c << 1;
        }
        return a;
    }
};

main()函数

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int a, b;
    cout << "请输入a,b的大小:" << endl;
    cin >> a >> b;
    Solution answer;
    cout << "两数的和为:" << answer.getSum(a, b) << endl;

    system("pause");
    return 0;
}

   转载规则


《Leetcode371》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Leetcode53-1 Leetcode53-1
Leetcode53-1:在排序数组中查找数字 I 题目描述       统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums = [5,7,7,8,8,10], target =
2020-04-20
下一篇 
剑指offer51 剑指offer51
剑指offer51:构建乘积数组 (Leetcode66) 题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1], 其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*.
2020-04-18
  目录