【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ

题目描述:

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

输入:

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

输出:

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

样例输入:

3 4
7 9
样例输出:

7
16
【解题思路】求和而不用四则运算,我们可能需要联想到加法的机器实现,机器实现当然原理和位操作类似,所以,我们可以通过位操作来实现加法。

       假设给出的num1和num2,首先我们将num1^num2得到那些0 1位应该相加,没有进位。然后,我们用num1&&num2得到所有进位组成的数,因为这个进位组成的数应该是左移一位然后加入到之前得到的那个没有进位的数中。若,还有进位,证明位操作还有冲突,需要继续左移并加入到之前的结果中。直到所有的进位处理完毕为止。

AC code:

#include <cstdio>
using namespace std;
 
int main()
{
  int n,m;
  while (scanf("%d%d",&n,&m)!=EOF)
  {
    int num1,num2;
    do
    {
      num1=n^m;
      num2=(n&m)<<1;
      n=num1;
      m=num2;
    }while(num2!=0);
    printf("%d
",num1);
  }
  return 0;
}
/**************************************************************
    Problem: 1507
    User: huo_yao
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1020 kb
****************************************************************/

题目链接:http://ac.jobdu.com/problem.php?pid=1507

九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299



原文地址:https://www.cnblogs.com/huoyao/p/4248872.html