不用+-×÷求两个整数的之和

分析:

这个问题最容易想到的是利用位运算实现。类似数字电路中的全加器的原理。

2bit全加器的原理如下:

输出S=A异或B

进位C=A与B

真值表如下:

A

B

S

C

0

0

0

0

0

1

1

0

1

1

1

1

         因此可以推广到一般数字相加的计算中。

         例如:5的二进制是101,17的二进制10001。

把计算分成三步:

第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10。这一步不计进位,因此结果仍然是0);

第二步记下进位。在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10;

第三步把前两步的结果相加,得到的结果是10110,正好是22。

         于是我们可以构造一个算法(运用递归的思想):两个数按位做异或运算(相当于不考虑进位的加法),再相与并左移一位向前进位,加上进位(可以用递归,因为没加一次都可能产生进位,进位为0就停止)。

 

实现代码:

int AddWithoutArithmetic(int num1, int num2)
{
        if(num2 == 0)
                return num1;
        int sum = num1 ^ num2;
        int carry = (num1 & num2) << 1;
        return AddWithoutArithmetic(sum, carry);
} 

 

另一种巧妙解法:

思想:将第一个数作为地址,第二个数作为地址偏移量,利用数组的下标运算加上偏移量。

实现代码:

int add(int a,int b)
{
    char * c;
    c = (char *) a;
    return &c[b];
}


你可能感兴趣的:(c,算法)