首页 > 编程 > C++ > 正文

371. Sum of Two Integers(C++)

2019-11-06 07:10:32
字体:
来源:转载
供稿:网友

题目:

Calculate the sum of two integers a and b, but you are not allowed to use the Operator + and -. 计算两个整数a和b的和,但不允许使用运算符+和 - 。

如果不能用加减运算,那还能有什么运算方法呢?当然了,还有亲切的位运算。

解题思路:

和平时做加减法一样,先各个位相加,然后得到的数再相加,注意:期间要考虑进位情况(有时候多次进位,比如:9999+1=10000)

二进制的两个数相比较无非三种情况: 1———–1———–0 0———–1———–0 相加后结果: 1———–0———–0 不进位|||进位1|||不进位

a 00101 b +11100 A.先考虑1+0以及0+0不会进位的两种情况,此时假使1+1=0(分开考虑是否进位两种情况),则容易想到用亦或^(相同为零,不同为一)运算。设c=a^b,则: c.1 11001 B.其次考虑进位情况,1+1=10进一位,可以先使1+1=1后整个数字向左移动一位变为10,即"<<1",要使1+1=1,且0+0=0,且1+0或0+1=0的方法就是按位与&(全为一得一,其他全为零)运算。于是设d=(a&b)<<1,则: d.1 01000 //事情到这里就结束了吗?我本来以为是的,喜洋洋的写了个“return ((a&b)<<1)^(a^b)"就上交了,结果试了几个数发现有对有错了,想了下,哎呀,忘进位了,这家伙还是个循环哩。 于是就有了c.1+d.1的运算:重复上面的运算,这不挺像递归的吗?让我试试有啥需要注意的,递归总要做到参数对应吧。 c.2 10001 d.2 10000 c.3 00001 d.3 100000 这最后一次运算就要返回答案了 c.4 100001 d.4 00000 也就是说c对应a,d对应b,且结束的条件是b==0,于是就有了下面的代码:

答案:

#include<iostream>using namespace std;int getSum(int a, int b){ if (b == 0) return a; int c = a^b; int d = (a&b) << 1; return getSum(c, d);}int main(){ int a, b; cin >> a >> b; cout << getSum(a, b); return 0;}

当然了也可以用for循环来解答,当符合条件的时候跳出循环(break) 也可以是while。。。

以后做题还是要细心啊


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选