[剑指offer]不用加减乘除做加法【python】

题目描述

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

解题思路:
【参考牛客上票数最高的解答】

链接:https://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215
来源:牛客网

首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。

同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 

第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。

第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。

第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。 继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。

【尝试写了python的代码,结果应该没有问题,但是计算时间复杂度太高了,运行不通过】

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        while num1 & num2 !=0:
            add_res = num1 ^ num2 #相加,不需要进位的位
            jin_res = (num1 & num2) <<1#算进位,需要进位的位
            num1 = add_res
            num2 = jin_res
        return num1 ^ num2

后来看到一个人是这么写的,就通过了:

# -*- coding:utf-8 -*-
class Solution: 
    def Add(self, num1, num2):           
        while(num2): 
           num1,num2 = (num1^num2) & 0xFFFFFFFF,((num1&num2)<<1) & 0xFFFFFFFF
        return num1 if num1<=0x7FFFFFFF else ~(num1^0xFFFFFFFF)

但其实一直不太懂0xFFFFFFFF的用处

待续……

0xFFFFFFFF=4294967295


整型(Int)
在Python内部对整数的处理分为普通整数和长整数,普通整数长度为机器位长,通常都是32位,超过这个范围的整数就自动当长整数处理,而长整数的范围几乎完全没限制
所以long类型运算内部使用大数字算法实现,可以做到无长度限制。
Python语言的整型相当于C语言中的long型,在32位机器上,整型的位宽为32位,取值范围为 -2147483648~2147483647;在64位系统上,整型的位宽通常为64位,取值范围为-9223372036854775808~9223372036854775807

// int型的最大值
2147483647 
0x7fffffff // 


https://www.techforgeek.info/python_max_min_int.html

https://blog.csdn.net/man_sion/article/details/72510284

猜你喜欢

转载自blog.csdn.net/Jillian_sea/article/details/80784766
今日推荐