题解 | #不用加减乘除做加法#

不用加减乘除做加法

http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215

题目:不用加减乘除做加法
描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路分析:
在编写代码的时候,我们首先得了解,在加法的过程中,是如何进行十进制或者二进制之间的计算。
5+7 = 12十进制的计算过程:
首先,计算个位的值,在不算进位值的同时,得到的结果为2。
其次,计算进位值,得到的结果为10,若进位值为0的话,则第一步计算的结果为最终结果。
最后,经过重复计算,将两个步骤得到的结果2和10相加得到12。
5+7 = 12二进制的计算过程:
首先,5的二进制为101,7的二进制为111,将各位的值相加,在不算进位的情况下得到010,二进制的每位相加是将各位做异或操作。
其次,计算进位制,得到1010,进位值的计算过程为两个数据中的数字做与操作,将结果左移一位得到最终的结果为1010。
最后,重复以上步骤,将各位相加后的结果为010^1010=1000,进位值为(010&1010)<<1 = 100,因为有进位,继续进行该操作,1000^100 = 1100,判断进位值为0,跳出循环,输出最终结果为1100。
图示:

结果

5(101)

7(111)

首先将各位的值相加,不算进位得到的结果为010(异或运算)

计算进位,进位操作为先与操作,后左移一位

1010

将进位与各位的值相与

010^1010=1000

判断进位值

100

再进行与操作

1000^100 = 1100

判断进位值为0,跳出循环

本题核心一直判断进位值。输出1100


具体C++代码为:
class Solution {
public:
    int Add(int num1, int num2) {
        while(num2 != 0){//进位值为0,则停止运算
            int add = num1 ^ num2;
            num2 = (num1&num2) << 1;//进位值 
            num1 = add; 
            } 
        return num1; 
    } 
};

Java版本为:
public class Solution {
    public int Add(int num1,int num2) {
        while(num2 != 0){
            int sum = num1^num2;
            int jinwei = (num1&num2)<<1; 
            num1 = sum; 
            num2 = jinwei; 
    } 
    return num1;
     } 
}
该算法总体来说,通俗易懂,只需要理解好,计算机是如何进行加减乘除的运算即可解决问题,在加法计算中,应该尤其注意进位和各位之间的运算,根据上述方法可以很快的解决问题。
        我在使用python实现的过程中,发现在python中,正整数是可以正常运行的,但是如果出现负数,会导致死循环的发生,在python中,超过32位的整数,会自动进行整数的转变,这就会导致在移位的过程中,出现死循环的情况,也导致程序不能正常运行,所以在执行的过程中,应该注意将index值与0xFFFFFFFF作比较。
        具体python代码如下所示:
# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        while num2:
            res = (num1 ^ num2) & 0xffffffff
            index = ((num1 & num2) << 1) & 0xffffffff
            num1 = res
            num2 = index
        if num1 <= 0x7fffffff:
            res = num1
        else:
            res = -((num1 - 1) ^ 0xffffffff)
        return res








算法自然分析 文章被收录于专栏

在解决问题的同时,不断与人交流学习,通过牛客各式各样的题目,学习分享。

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务