题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
思路是:
第一步,求不进位相加和sum
第二步,求进位carry
第三部,sum和carry*10的和
比如:23 8的和
第一步后是:21
第二步后是:1
第三步后是:31
代码如下:
递归解法:
int AddWithoutArithmetic(int num1, int num2)
{
if(num2 == 0)
return num1;
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
return AddWithoutArithmetic(sum, carry);
}
因为以上递归是尾递归,可以改为迭代运算:
非递归解法:
#include <stdio.h>
int Add(int iNum1, int iNum2)
{
while(iNum2 != 0){
int iCarry = (iNum1 & iNum2);
iNum1 ^= iNum2;
iNum2 = iCarry << 1;
}
return iNum1;
}
int main(void)
{
printf("%d\n",Add(23,5));
return 0;
}
其他解法:
代码如下:
int add(int a,int b){
char * c;
c = (char *) a;
return &c[b];
}
解释:
首先把a转换为指针类型,指向char类型数据。然后做&c[b]运算,也就是&*(c + b)。也就是c+b,因为c是char *类型,地址移位运算后就是a+b。
参考:
http://zhedahht.blog.163.com/blog/static/254111742011125100605/