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 };
  • 相关阅读:
    关键字,保留字
    20181024
    php连接mysql数据并查询
    java 字符串的json格式数据转换成Map集合
    IntelliJ IDEA的一些快捷键
    Java的反射机制简述
    java主函数知识
    单例设计模式---懒汉式的多线程安全隐患
    java的单例设计模式(对象的延时加载)考试专用
    java的单例设计模式
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606409.html
Copyright © 2011-2022 走看看