One - One Code All

Blog Content

Lintcode-1:A + B 问题

每日一练 算法 C/C++ LintCode   2010-03-01 19:12:07

A + B 问题:给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。


举两个例子   

例子一:  整数 5   和 整数 17  

例子二:  整数 20  和 整数 2

 
异或运算的运算方式 是二进制   0 ^ 0 = 0 ,  1 ^ 1 = 0 , 0 ^ 1 = 1 ,  1 ^ 0 = 1    ;  异或运算 是忽略进位的 加法
与运算的运算方式 是二进制  0 & 0 = 0 ,  1 & 1 = 1, 0 & 1 = 0 ,  1 & 0 = 0   ;  与运算是为了计算进位的 结果。
例如 结果 0001 << 1 =  0010  =  2(十进制) ,当进位结果左移一位 仍然是 0000 0000 时 ,意味加法无进位。

 
解题步骤 :  
 1. 二进制 5 和 二进制 17 进行 异或运算(^),忽略进位。得出 结果 x1 。含义是 二进制异或运算 计算两个二进制忽略 进位的加法结果。
 2. 二进制 5 和 二进制 17 进行 与运算(&),得出结果 再 向左移一位 , 得出结果 x2。 含义是 二进制与运算 计算出 两个二进制数相加 是否出现进位 现象
 3. 将结果x1和结果x2相加 就是 两个整数相加的结果。

/*
* 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
*/

#include 

int aplusb(int a, int b) { 
        if(a==0)return b; 
        if(b==0)return a; 
        int x1 = a^b; 
        int x2 = (a&b)<<1; 
        return aplusb(x1,x2); 
} 

int main()
{
    int a=5,b=10;
    int result = aplusb(a, b);
 
    printf("两个数相加 %d + %d = %d ",a,b,result);
 
    printf("\n");
    return 0;
}




下一篇:Lintcode-2:尾部的零

The minute you think of giving up, think of the reason why you held on so long.