<九度 OJ>题目1507:不用加减乘除做加法

题目描述:

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000)。

输出:

对应每个测试案例,输出m+n的值。

样例输入:
3 4
7 9
样例输出:
7
16

分析:

1、先将各bit位相加,不计进位,这一步可以用m^n实现
2、加上进位,进位如何来,用m&n可以得到m和n中都为1的bit位,而不全为1的位则全部变为了0,该位相加会发生进位,使得左边一位加1,因此(m&n)<<1边可得到进位后要加的1的位置;
3、将前面两步的结果相加,相加的时候还有可能再产生进位,因此二者相加的过程可以再次重复循环步骤1和2,直到(m&n)<<1变为了0,这时候不会再产生进位,退出循环即可。


#include <iostream>
#include "algorithm"
  
using namespace std;
 
 
int solutionAdd(int n,int m)
{
    int num1 = 0, num2;
    do
    {//举例5+17,5(101),17(10001)
        num1 = n^m; //模拟二进制中各位相加(但不进位), 异或(不同则为真,结果为10100
        num2 = (n & m) << 1;//获取模拟进位结果,因为只有相应位同时为1时才能为真,所以让结果往左移,结果00010
        n = num1;
        m = num2;
    } while (num2 != 0);//如果还有进位,就再加上进位
    return num1;
}
 
int main()
{
    int n = 0, m = 0;
    while (cin >> n >> m)
        cout << solutionAdd(n,m) << endl;
    return 0;
}
/**************************************************************
    Problem: 1507
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:50 ms
    Memory:1520 kb
****************************************************************/


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50526099

原作者博客:http://blog.csdn.net/ebowtang


你可能感兴趣的:(LeetCode,面试,动态规划,九度,贪心策略)