您的位置:首页 > 其它

lintcode 中等题:A + B Problem A + B 问题

2015-10-22 21:05 218 查看
题目:

中等 A + B 问题

给出两个整数a和b, 求他们的和, 但不能使用
+
等数学运算符。

如果
a=1
并且
b=2
,返回
3


注意

你不需要从输入流读入数据,只需要根据
aplusb
的两个参数a和b,计算他们的和并返回就行。

挑战

显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?

说明

a和b都是
32位
整数么?

是的

我可以使用位运算符么?

当然可以

解题

上面提示了用位运算,通过不能够用加法,应该也会用到逻辑运算,感觉应该提取a、b的每位数据进行计算,也就是:a1 = a & 1 ,b1 = b & 1 这个就把a、b的最低位提取出来了,同时在进行下一位计算的时候a、b要右移一位,也就是 a = a>> 1 、b = b>> 1,下面问题是中间该怎么搞?参考博客

a1、b1是a、b的对应位,carry1上一位的进位数,carry2是这一位的进位数,val是a1、b1、carry的和,计算结果有下表:

a1b1carry1carry1val
00000
00101
01001
10001
11111
11010
10110
01110
下面即简单又不简单

val是第i位的数,carry2是要进位的数,下一轮循环将会代替carry1

val应该在第i位,左移i位可以解决问题,val = val << i

sum 用来保存结果,初始值是 0 ,sum和val进行或运算,<只要有一个1 就是1>,在进行地位运算的时候,高位都是0,也就是主要判断val的值是不是1的问题,sum = sum | val

这里的过程还真的不好想的

下一轮循环就是 a = a >> 1 b = b >> 1

Java程序:

class Solution:
"""
@param a: The first integer
@param b: The second integer
@return:  The sum of a and b
"""
def aplusb(self, a, b):
# write your code here, try to do it without arithmetic operators.
if b == 0:
return a
if a == 0:
return b
while b!=0:
carry = (a&b)<<1
a = a ^ b
b = carry
return a


View Code


都是这个数据的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: