题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
如果没有以前没有做过类似的,则不太好想,虽然当限定不使用加减乘除做加法算法,我们都会想到会用其他的位运算来做。但要想想出来,还是有一定困难的。
思路:分三步
1、先将各bit位相加sum,不计进位,这一步可以用m^n实现
2、计算进位,进位如何来,用m&n可以得到m和n中都为1的bit位,而不全为1的位则全部变为了0,该位相加会发生进位,使得左边一位加1,因此(m&n)<<1便可得到进位的数carry;
3、将前面两步的结果相加即(sum、carry相加),即重复上面两步,直到进位为零,则计算结束。
/*
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000)。
输出:
对应每个测试案例,输出m+n的值。
样例输入:
3 4
7 9
样例输出:
7
16
*/
#include<stdio.h>
#include<stdlib.h>
int sumAbout2Num(int num1,int num2){
//通过异或每个比特位来进行求解
int sum=0;
int carry=0;
do{
//第一步:求和但不计进位
sum=num1^num2;
//第二步:计算进位
carry=(num1&num2)<<1;
//第三步:将sum、carry相加,即重复前面两步
num1=sum;
num2=carry;
}while(num2!=0);
return num1;
}
int main(void){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&n>=1&&n<=1000000&&m>=1&&m<=1000000){
printf("%d\n",sumAbout2Num(n,m));
}
}