题目:
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。。。
以后做题还是要细心啊