Calculate the sum of two positive or negative integers
我正在学习python,尝试解决以下问题。
计算两个整数A和B的和,但不允许使用运算符+和-。
例子:给定a=1和b=2,返回3。
我提出的以下解决方案适用于正整数,但如果a=-1和b=1,则不适用。
我想知道你如何处理负值。
1 2 3 4 5 6 7 8 9 10 11 12 | class Solution(object): def getSum(self, a, b): """ :type a: int :type b: int :rtype: int """ while b != 0: carry = a&b a= a^b b= carry<<1 return a |
如果您真的想学习python,有很多其他的方法可以找到两个数字的和。使用位运算符只能教会你所涉及的算法,而IMO并不是开始学习任何语言的好方法;因此,我的答案不会涉及任何位操作。
以下是不使用带有内置python功能的plus("+")运算符进行添加的许多方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | a = 1 b = 2 # The"sassy" way as suggested by miradulo, uses the built in function `sum()` print(sum((a, b))) # uses a's __add__ magic method to add with b print(a.__add__(b)) # similar to the previous, but directly uses int's __add__ instead print(int.__add__(a, b)) # uses the add operator as a function, equivalent to `anything + anything` from operator import add print(add(a, b)) # they all return '3' |
我明白了。不使用诸如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | def getSum(a, b): negative_number = None if a == 0: return b elif b == 0: return a if a < 0 and b < 0: pass elif a < 0: negative_number = a elif b < 0: negative_number = b if (a < 0 and b < 0) and abs(a) == abs(b): return int("-%s" % (str(getSum(abs(a), abs(b))))) elif abs(a) == abs(b) and (a < 0 or b < 0): return 0 elif negative_number != None: x = getSum(abs(a), abs(b)) if x > 2*abs(negative_number): return subtract(getSum(abs(a), abs(b)), 2*abs(negative_number)) else: return subtract(2*abs(negative_number), getSum(abs(a), abs(b))) while b != 0: carry = a&b a = a^b b= carry<<1 return a def subtract(x, y): #Subtraction function without - operator. while (y != 0): borrow = (~x) & y x = x ^ y y = borrow << 1 return x print (getSum(-15, 16)) #Substitute -15 and 16 for any values to find the sum |
号
现在尝试你想要的任何姿势。对于大多数数字来说,它都会很好地工作,除了一些我会攻击的角落案例,一旦我有了一个完整的解决方案,我就会发布它。
为了解决您的方法,您应该检查哪些值不起作用,并以某种方式捕获它们(例如,
编辑:正如boi和hotspring指出的,只有当a和b有不同的标志时,它才会失效。如果a<0 xor b<0,可以添加一个substract函数(见另一个答案),并将其用作
另一种可能的方法——缓慢但简单——可能是: