不使用+、-、*、/运算符,实现两个数的加法运算

不使用+、-、*、/运算符,实现两个数的加法运算

LeetCode题目:不使用+、-、*、/运算符,实现两个数的加法运算



在计算机中,对数除了进行四则运算外,还可以进行位运算,当题目告诉不能使用四则运算的时候,自然应该想到计算机中的位运算。

首先从从十进制出发,15+18=33,对于这个运算可以拆分为三步,第一步:不考虑进位个位与个位相加,十位与十位相加,个位相加结果为3,十位相加结果为2,此时结果为23;第二步:判断是否有进位情况,在各位中5+8有进位,所以需要一个进位10;第三步:将没有进位的结果与进位进位相加,23+10=33。

由于题目要求,不能使用加法,所以使用针对二进制的位运算。首先在不仅为的情况下考虑二进制加法:1+1=0、1+0=1、0+1=1、0+0=0,不难发现此时的加法结果和位运算的异或运算结果相同,所以上段写的第一步加法可以用异或代替。其次第二步,要考虑些加法需要进位,此时二进制中涉及进位的只有1+1的情况,其他情况都不需要进位,所以应该想到的是二进制的与运算,与运算之后只能得出是此位置上的运算要进位,由十进制可知,需要将此结果向左移一位。最后是第三步,就是将两个结果相加,此时的相加需要循环上边的两个操作即可。

具体代码实现

#include<stdio.h>
int getnumber(int a, int b);
int main()
{
    int a, b,c;                     //a,b为操作数,c存放两数之和
    scanf_s("%d %d", &a,&b);        //输入
    c = getnumber(a, b);
    printf("%d", c);
    return 0;
}
int getnumber(int a, int b)
{
    int sum, str;
    if (b == 0) {
        return a;                 //当与运算为0时结束
    }
    sum = a ^ b;                  //异或运算,计算不进位时的值
    str = (a & b) << 1;           //存放要进位的值
    return getnumber(sum, str);   //递归实现
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fromone0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值