[LintCode] A + B 问题

简介: Bit-by-Bit summation: 1 class Solution { 2 public: 3 /* 4 * @param a: The first integer 5 * @param b: The second integer 6...

Bit-by-Bit summation:

 1 class Solution {
 2 public:
 3     /*
 4      * @param a: The first integer
 5      * @param b: The second integer
 6      * @return: The sum of a and b
 7      */
 8     int aplusb(int a, int b) {
 9         // write your code here, try to do it without arithmetic operators.
10         int res = 0, sum = 0, carry = 0;
11         for (int i = 0; i < 32; i++, a >>= 1, b >>= 1){
12             int d1 = a & 1, d2 = b & 1;
13             sum = (d1 ^ d2 ^ carry);
14             carry = max((d1 & d2), max((d1 & carry), (d2 & carry)));
15             res ^= (sum << i);
16         }
17         return res;
18     }
19 };

Treat a + b as two parts:

  1. a + b without carry;
  2. carry of a + b;
  3. recursively plus part 1 and part 2 until no carry exists.
 1 class Solution {
 2 public:
 3     /*
 4      * @param a: The first integer
 5      * @param b: The second integer
 6      * @return: The sum of a and b
 7      */
 8     int aplusb(int a, int b) {
 9         // write your code here, try to do it without arithmetic operators.
10         while (b) {
11             int carry = a & b;  // carry
12             a ^= b;             // plus without carry
13             b = carry << 1;     // recursively plus the two parts
14         }
15         return a;
16     }
17 };

The code can be further shortened by writing it recursively.

 1 class Solution {
 2 public:
 3     /*
 4      * @param a: The first integer
 5      * @param b: The second integer
 6      * @return: The sum of a and b
 7      */
 8     int aplusb(int a, int b) {
 9         // write your code here, try to do it without arithmetic operators.
10         if (!b) return a;
11         return aplusb(a ^ b, (a & b) << 1);
12     }
13 };

Or just in one line :-) 

 1 class Solution {
 2 public:
 3     /*
 4      * @param a: The first integer
 5      * @param b: The second integer
 6      * @return: The sum of a and b
 7      */
 8     int aplusb(int a, int b) {
 9         // write your code here, try to do it without arithmetic operators.
10         return (!b ? a : aplusb(a ^ b, (a & b) << 1));
11     }
12 };

 

目录
相关文章
lintcode 415 有效回文串
用String下的spilt(regex)去除除英文外的符号,regex是正则表达式,[]内写要删除的符号,但返回值是一个String型数组。
|
人工智能 BI C#
Cool说丨力扣剑指offer.66
剑指 Offer 66. 构建乘积数组
59 0
|
机器学习/深度学习 存储 算法
LintCode 题解丨大厂面试题:N皇后问题
LintCode 题解丨大厂面试题:N皇后问题
LintCode 题解丨大厂面试题:N皇后问题
|
算法 C++ Python
【LintCode: 3. 统计数字】算法题解析
这是一道来自LintCode的算法题目,本文用C++来解答这道题,链接为: https://www.lintcode.com/problem/digit-counts/description 题目描述 计算数字k在0到n中的出现的次数,k可能是0~9的一个值。
1130 0