题目:要求不使用基本四则运算的加法即不能使用‘+’,完成两个整数的相加
解题思路:在不能使用加法的情况下,想办法模拟出加法操作的步骤,从而完成整数相加操作。两个数a和b相加,其结果可以分离为进位和不进位的结构相加。只要能够计算出进位结果和没进位的结果,然后递归调用相加就能够达到题目要求。c语言中的位操作中,a&b可以取出两方都是1的位,这实际上就是进位。而a^b则能够取出一方为一,一方为零的位,实际上就是相加中没进位的位。这样不难写出代码如下。
代码:
以下代码在Visual Studio2010测试通过!
Version1.0
/*
Author:GS<song0071000@126.com>
Time:2013/10/30
Funtion:implement addtion option with out the use of "+"
*/
unsigned int addition(unsigned int a,unsigned int b)
{
if(b == 0)
return a;
return addition(a^b,(a&b)<<1);
}
注意以上代码:只是两个无符号的整数相加的情况。在本身a加b的和不溢出的情况下,是没有问题的。
至于两个有符号的整数相加的情况(主要是考虑到负数参与加法的情况,对以上实现代码有影响),后续继续讨论!
该方法可以用于有符号的两个整数相加的情况。博主想当然的认为,在符号位会影响结果。而事实上,博主想偏了!!博主所举反例是无符号的数和有符号的数相加的情况,但这种情况显然不是由该算法所考虑的问题。题目本身存在必要的条件就是类型相同的数相加,否则就不单纯的是考算法了。
这样将原代码改为如下:
int addition(int a,int b)
{
if(b == 0)
return a;
return addition(a^b,(a&b)<<1);
}