基础编程题之不用加减乘除做加法

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础编程题之不用加减乘除做加法相关的知识,希望对你有一定的参考价值。

题目

牛客
在这里插入图片描述

解题思路

这种题其实有非常多的解法,这里我们一定要掌握一种效率最高的算法,那就是利用位运算,其本质也就是二进制的加法

在十进制中,我们做加法一般遵循以下三步:以5+7为例

  1. 首先从个位开始相加,不要算进位,得到2
  2. 接着计算进位的值,为10
  3. 如果进位的值为0,那么直接结束,可以结束计算或者进行下一位;像第二步那种情况,进位为1,所以给十位进位。

而在二进制中,其实也是遵循三个步骤:以5+7为例,其二进制分别为101和111

  1. 首先把每一位进行相加,得到010而这样的操作其本质就是异或运算,因为异或运算是相异为1,相同为0,相异也就是意味着一个数一定是0,一个数一定是1
  2. 然后计算进位值,也即1010其实就是每一位进行与运算得到101后再左移一位,得到1010,即(1010 & 111) << 1。
  3. 可以发现进位值不为用,所以重复先前两步,而现在的两个操作变成了相加后的结果010和进位值1010。(异或运算结果:010 ^ 1010=1000;进位值为:(010 & 1010) << 1)一直重复到进位值为0结束运算即可

代码

class Solution {
public:
    int Add(int num1, int num2) 
    {
        while(num2)//num2作为进位值
        {
            int sum=num1 ^ num2;//不算进位后的相加结果
            int carry=(num1 & num2) << 1;//进位
            num1=sum;
            num2=carry;
        }
        return num1;
    }
};

以上是关于基础编程题之不用加减乘除做加法的主要内容,如果未能解决你的问题,请参考以下文章

不用加减乘除如何做加法 Java版

不用加减乘除如何做加法 Java版

不用加减乘除做加法

剑指Offer - 不用加减乘除做加法

66 不用加减乘除做加法

[剑指offer]面试题47:不用加减乘除做加法