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

我正在学习python,尝试解决以下问题。

计算两个整数A和B的和,但不允许使用运算符+和-。

例子:给定a=1和b=2,返回3。

我提出的以下解决方案适用于正整数,但如果a=-1和b=1,则不适用。

我想知道你如何处理负值。

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操作符来作弊吗,或者你必须使用位操作符吗?

问题是什么?

如果你想成为一个时髦的sum((a, b))。

@它也适用于负数。当A&B有相反的标志时,它就不起作用了。

那我怎么能应付这种情况呢?

@miradulo,这个链接也只处理正整数。我的解也适用于正整数。

使用有符号整数进行计算需要固定的位长度。恐怕python不能保证这一点,但对其内部结构不太清楚。

@如果你的整数是32位,请看这个问题。

这个问题需要反复讨论吗?为什么不只是return a.__add__(b)呢?

@是什么让你这么想的?因为它们的格式都像leetcode解决方案?

@温泉:你能解释一下你是否需要使用钻头操作吗?如果没有,请随意接受ABCCD的回答,或者,如果这对你来说太"时髦",请接受我的回答。

在python中不使用"+"运算符的两个整数之和的可能重复;因为它实际上解决了问题。

如果您真的想学习python,有很多其他的方法可以找到两个数字的和。使用位运算符只能教会你所涉及的算法,而IMO并不是开始学习任何语言的好方法;因此,我的答案不会涉及任何位操作。

以下是不使用带有内置python功能的plus("+")运算符进行添加的许多方法:

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()之类的内置函数的解决方案。首先定义一个不带-运算符的减法函数。然后你可以用它来解决问题。干得好!:

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

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

试试getSum(10, -100)怎么样。仍然破碎。

@米拉多洛,我不知道该怎么办。有什么帮助吗?

你可以把a < 0 or b < 0改写成negative_number != None。但最后,我认为这个答案现在是有效的。现在等着手术……

现在你要向abs传递两个参数。

@米拉多洛,你什么意思?

@BOI A括号问题:)

现在也试试getSum(-10, 100),不起作用。实际上,现在您的示例案例也不起作用。

@米拉杜洛是的,所以我向你求助。我不明白为什么OP不能只用+和-。使我们的生活更加艰难。:)

我将把这个答案保留在这里,因为我们几乎快要得到一个完整的解决方案了。同时,我会设法弄清楚的。@温泉看看这个。仍然有一些角落的情况需要解决,但它主要是工作。当我有一个完整的解决方案时,我会告诉你。如果您找到完整的解决方案,请随意编辑或评论。谢谢

@博伊,这不是一个真正的代码审查网站,但这个答案不起作用-我看不到它的价值。不管怎样,对于具有无限二的补码表示的Python,我怀疑您是否能够在不完全分离正负情况的情况下实现这一点。

@Miradulo完成了。找到了一个完整的解决方案。现在应该是真的了:)

@这里的温泉是完整的解决方案

@boi getSum(-1000, 0)是1000…

@米拉多洛哇。你很擅长在代码中发现错误:)我也修正了这个问题。

@为什么要谢谢你?现在,getSum(1, -1000)是999;)

@米拉多洛,神圣的莫里。此代码需要花费大量精力来修复;)

为了解决您的方法,您应该检查哪些值不起作用,并以某种方式捕获它们(例如,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为零。

当A和B有不同的符号时,它不会失效。请看我的答案。

正如温泉城指出的,这似乎是正确的。不管怎样,它在其他情况下肯定不会失败(我希望如此)。这种位操作在高级语言中是不应该做的。

请再看一下我的答案。

为什么我被否决?

@Xanoteux我不确定。也许它没有帮助手术,或者有人认为它没有帮助。我真的不知道。

我投了反对票,因为这个答案很不完整。"不知何故抓住他们?怎样?您的实现是什么样子的?同样,对于后一种方法,您打算如何在不使用+=或-=的情况下增加和减少?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值