zoukankan      html  css  js  c++  java
  • [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      * @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 };
  • 相关阅读:
    《浪潮之巅》读后感
    学习进度表
    学习进度表
    兴趣问题清单
    第六周周结
    价值观作业
    学习进度表
    第三次作业(问卷调查)
    第五周(生成动态表格)
    【Other】LanProxy内网穿透
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606409.html
Copyright © 2011-2022 走看看