给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
1,2
返回:3
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
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; } }
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; }
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;
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); } };
/* 思路:使用位运算 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; } };