关于python:计算两个正整数或负整数之和

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'

我明白了。不使用诸如sum()之类的内置函数的解决方案。首先定义一个不带-运算符的减法函数。然后你可以用它来解决问题。干得好!:

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

现在尝试你想要的任何姿势。对于大多数数字来说,它都会很好地工作,除了一些我会攻击的角落案例,一旦我有了一个完整的解决方案,我就会发布它。


为了解决您的方法,您应该检查哪些值不起作用,并以某种方式捕获它们(例如,if a == -1 and b == 1)

编辑:正如boi和hotspring指出的,只有当a和b有不同的标志时,它才会失效。如果a<0 xor b<0,可以添加一个substract函数(见另一个答案),并将其用作Substract(a, -b)

另一种可能的方法——缓慢但简单——可能是:

  • 查看第二个操作数是否为负数。
  • 如果不是(也就是说,如果b是正数),则递增a并递减b,直到b为零。
  • 如果是(也就是说,如果b为负),则减小a并增加b,直到b为零。