首页 > 试题广场 >

另类加法

[编程题]另类加法
  • 热度指数:8028 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定两个int AB。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。

测试样例:
1,2
返回:3
public int addAB(int A, int B) { 
        int tem=0;//代表进位位
	do{
		tem=A&B;
		A=A^B;
		B=tem<<1;
	}
	while(B!=0);
	return A;
 }

编辑于 2016-08-12 16:12:02 回复(5)
import java.util.*;
/*
思路:肯定是用位运算,我记得位运算A^B是不考虑进位的结果,(A&B)<<1是求得的进位
因此A^B+(A&B)<<1的结果就是和,只要(A&B)<<1=0,两项就变成了一项,不需要加法了
*/
public class UnusualAdd {
    public int addAB(int A, int B) {
        if(B!=0){
            int a=A^B;
            int b=(A&B)<<1;
            return addAB(a,b);
        }else{
            return A;
        }
    }
}
运行时间:82ms
占用内存:8912k

发表于 2017-07-06 15:18:50 回复(0)
class Solution
{
  public:
      int add(int A, int B)
      {
         if(A == 0)
              return B;
         else if(B == 0)
              return A;
         else
              return add(A^B, (A&B)<<1);
      }
}

发表于 2015-08-07 00:07:46 回复(0)
import java.util.concurrent.atomic.AtomicInteger;

public class UnusualAdd {
    public int addAB(int A, int B) {
        AtomicInteger num = new AtomicInteger(A);
        num.getAndAdd(B);
        return num.get();
    }
}

发表于 2022-03-30 14:49:14 回复(0)
  代码实现,已通过。
  思路:利用位运算,
  对于异或:0^0=0,1^0=1,1^1=0,可以实现数字无进位相加。
  再用与运算0&0=0,1&0=0,1&1=1,将与运算的结果左移1位即可变为进位位。
  一直加到进位位为0结束计算。
  代码如下:
import java.util.*;

public class UnusualAdd {
    public int addAB(int A, int B) {
        int carry=(A&B)<<1;
        A=A^B;
        B=carry;
        while (B!=0)
        {carry=(A&B)<<1;
           A=A^B;
           B=carry;
        }
return A;
    }
}


发表于 2020-02-12 09:28:51 回复(0)
class UnusualAdd {
public:
    int addAB(int A, int B) {
        // write code here
        int addNoCarry;
        int carry;
        while (B != 0) {
            addNoCarry = A ^ B;
            carry = (A & B) << 1;
            A = addNoCarry;
            B = carry;
        }
        return A;
    }
};

运行时间:5ms

占用内存:460k


发表于 2019-07-12 16:26:42 回复(0)
位运算
发表于 2018-06-05 11:11:57 回复(0)
利用位运算进行实现。 不考虑进位情况下,a^b为正确结果; 只考虑进位的情况下,(a&b)<<1是正确结果。若(&<<1)运算结果为0,则过程终止。
class UnusualAdd {
public:
    int addAB(int A, int B) {
        // write code here
        int sum=A;
        while(B!=0)
        {
            sum=A^B;
            B=(A&B)<<1;
            A=sum;
        }
        return sum;
    }
};

发表于 2017-05-21 15:24:36 回复(0)
class UnusualAdd:
    def addAB(self, A, B):
        if B == 0:
            return A
        return self.addAB(A ^ B, (A & B) << 1)

发表于 2017-03-13 11:42:14 回复(0)
class UnusualAdd {
public:
    int addAB(int A, int B) {
       	if (A==0) return B;
        if (B==0) return A;
        int a=A^B,b=(A&B)<<1;
        return addAB(a,b);
    }
};

编辑于 2016-08-05 15:35:54 回复(1)
L0L头像 L0L
int addAB(int A, int B) {
       int sum=A^B,carry=(A&B)<<1;
       while(carry){
       	int tmp=sum;
       	sum=sum^carry;
       	carry=(tmp&carry)<<1;
	   }
	   return sum;
    }

发表于 2015-10-14 17:03:41 回复(0)
class UnusualAdd {
public:
    int addAB(int A, int B) {
        // write code here
         if(B == 0)
            return A;
        int sum = A ^ B;   
        int flag = (A & B) << 1; 
        return addAB(sum,flag);
    }
};

发表于 2015-07-29 15:50:25 回复(0)
我觉得这是最简单的了,虽然我也没懂原理
public int addAB(int A, int B) {
        int c=(A|B)+(A&B);
        return c;
    }


发表于 2019-11-22 19:44:31 回复(1)
二进制加法。发现一个特点。
位的异或运算跟求'和'的结果一致:
异或 1^1=0 1^0=1 0^0=0     
求和 1+1=0 1+0=1 0+0=0
位的与运算跟求'进位‘的结果一致:
位与 1&1=1 1&0=0 0&0=0
进位 1+1=1 1+0=0 0+0=0
于是可以用异或运算和与运算来表示加法
    public int addAB(int A, int B) {
        int xor,and;
        while(B!=0){
            xor = A^B;
            and = (A&B)<<1;
            A=xor;
            B=and;
        }
        return A;
    }

发表于 2017-03-28 18:48:29 回复(6)

return A+B
编辑于 2017-10-01 22:51:26 回复(5)
class UnusualAdd {
public:
    class Add
    {
        public:
        Add()
        {
            ++_i;
        }
    };

    int addAB(int A, int B) {
        _i = 0;
        Add arr1[A];
        Add arr2[B];
        return _i;
    }
    private:
    static int _i;
};
    int UnusualAdd::_i = 0;

发表于 2024-01-31 11:40:43 回复(0)
两个数字的相加:
    异或可以实现数字无进位相加,再用与运算,将与运算的结果左移1位即可变为进位。
一直加到进位位为0结束计算。

    求取数字相加后当前二进制位的取值(不考虑进位)
    求取数字相加后进位的数值

例如:

1+3 
0000 0001
0000 0011

相加后二进制取值不考虑进位:0000 0010    异或:相同为0,不同为1
相加后进位的数据:                  0000 0010    相与后左移一位

再把得到的两个数相加直到其中一个为0为止:
相加后二进制取值不考虑进位:0000 0000     为0
相加后进位的数据:                  0000 0100     最终结果

class UnusualAdd {
public:
    int addAB(int A, int B) 
    {
        if(A==0)
            return B;
        if(B==0)
            return A;
        return addAB(A^B,(A&B)<<1);
    }
};



编辑于 2022-10-21 15:52:44 回复(0)
import java.util.*;

public class UnusualAdd {
    public int addAB(int A, int B) {
        if (B == 0) {
            return A;
        }
        int sum = 0;
        int carry = 0;
        while (B != 0) {
            sum = A ^ B;
            carry = (A & B) << 1;
            A = sum;
            B = carry;
        }
        return sum;
    }
}
发表于 2023-08-10 16:49:39 回复(0)
/*
思路:使用位运算

a:1 0 1 0
b:0 1 1 0

a b异或得到的是不进位的结果
1 1 0 0

a b相与得到的是需要进位的数字
0 0 1 0

因此我们完全可以把B当作进位来处理。

*/
class UnusualAdd {
public:
    int addAB(int A, int B) {
        
        //我们把B当作进位,只有当进位是0的时候,才说明不用运算了
        while(B!=0){

            //获取不进位数值
            int a=A^B;

            //获取进位数值
            int b=(A&B)<<1;

            //A变成新的不进位数值
            A = a;
            
            //B变为新的进位数值
            B = b;
        }

        return A;
    }
};

发表于 2023-04-13 15:03:24 回复(0)
class UnusualAdd 
{
public:
    int addAB(int A, int B) 
    {
        int c = A ^ B;
        int d = (A & B) << 1;
        if(c == 0 || d == 0)
            return c;
        return addAB(c, d);
    }
};

发表于 2023-03-12 20:50:12 回复(0)

问题信息

难度:
54条回答 13962浏览

热门推荐

通过挑战的用户

查看代码
另类加法