Lintcode 1. A + B Problem
Solution:
1 int aplusb(int num1, int num2) { 2 3 if(num2==0) return num1;//没有进位的时候完成运算 4 5 int sum,carry; 6 7 sum=num1^num2;//完成第一步没有进位的加法运算 8 9 carry=(num1&num2)<<1;//完成第二步进位并且左移运算 10 11 return aplusb(sum,carry);//进行递归,相加 12 13 }
接下来来分析一下这个程序设计的思路:
对于加法 : a + b
按照这个程序的思路可以把加法分为两个部分:
第一个部分:不产生进位的时候的和
第二个部分:一个可以用来表示这一次加法运算中所有进位的数
根据上面的描述:
第一部分:a^b
第二部分:(a&b)<<1
注: 第二部分为什么要右移一位,例如一个两位二进制的数 01 & 01 , 是第一位(右边是低位)产生了进位,当时对第二位产生了影响,所以所得结果应为10
然后不断重复这两个部分,当没有无进位发生的时候,纯粹的 a^b 即为 a+b
参考连接:
https://www.cnblogs.com/luowei010101/archive/2011/11/24/2261575.html