371. Sum of Two Integers(C++)

题目:

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+00+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。。。

以后做题还是要细心啊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值