【发布时间】:2015-06-07 17:33:10
【问题描述】:
我试图解决一个老问题:
编写一个将两个 [integer] 数字 A 和 B 相加的函数。不应使用 + 或任何算术运算符。
最好的解决方案是这样的,引用自“LintCode-A+B Problem”:
对于任何底数的 a + b,我们可以将加号视为两部分: 1. a + b 不带进位; 2. a+b产生的进位。 a+b 等于第 1 部分加上第 2 部分。如果第 1 部分+第 2 部分产生更多进位,我们可以重复此过程,直到没有进位。
我能理解这个算法,一切似乎都很好,所以我在lintcode 上测试了它,代码粘贴在下面。
class Solution:
"""
@param a: The first integer
@param b: The second integer
@return: The sum of a and b
"""
def aplusb(self, a, b):
while b != 0:
carry = a & b
a = a ^ b
b = carry << 1
return a
但令人惊讶的是,它在测试用例[100, -100] 中给了我Time Limit Exceeded 错误。所以我在本地运行它并为每个循环打印 a、b:
(-8, 8)
(-16, 16)
(-32, 32)
(-64, 64)
(-128, 128)
(-256, 256)
(-512, 512)
(-1024, 1024)
(-2048, 2048)
(-4096, 4096)
(-8192, 8192)
(-16384, 16384)
(-32768, 32768)
(-65536, 65536)
(-131072, 131072)
...
计算是正确的,所以我认为这个算法不适用于这样的输入,但是当我用 C++ 编写相同的算法时,它就可以了:
class Solution {
public:
int aplusb(int a, int b) {
while (b!=0){
int carry = a & b;
a = a^b;
b = carry << 1;
}
return a;
}
};
我不知道具体应该问什么,基本上问题是:
- 为什么 C++ 给出正确的输出
0而 Python 没有? - 如果我使用 Python,如何修改此算法以使其正常工作?
【问题讨论】:
标签: python c++ algorithm bit-manipulation