不使用+、-、*、/运算符,实现两个数的加法运算
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); //递归实现
}