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 };
  • 相关阅读:
    文本框textarea根据输入内容自适应高度 和输入中文和数字换行解决方法
    switch 和 if...else if 的区别
    vue中 eCharts 自适应容器
    AJAX跨域POST发送json时,会先发送一个OPTIONS预请求
    获取鼠标和元素的坐标点
    vue2 数据交互 vue-resource
    网站代码初始化
    vue2 关于ref
    事件监听
    cookie 的 写入,读取, 删除
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606409.html
Copyright © 2011-2022 走看看