不使用加号,完成整数的相加

题目:要求不使用基本四则运算的加法即不能使用‘+’,完成两个整数的相加


解题思路:在不能使用加法的情况下,想办法模拟出加法操作的步骤,从而完成整数相加操作。两个数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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值