微软等数据结构+算法面试100题(22)--几道算数题

比较有意思的几个题:
1.题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
2.不用四则运算计算俩个数的积。
3.计算一个数化为二进制中含有1的个数。
4.对一个32位的数循环右移,返回结果。

/*
1.不用四则运算计算俩个数的和。
比如是如何得出5+17=22这个结果的。实际上,
我们可以分成三步的:
第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);
第二步做进位,5+7中有进位,进位的值是10;
第三步把前面两个结果加起来,12+10的结果是22,刚好5+17=22。
*/

int Add(int x,int y)
{
	if(y==0)
		return x;
	int tmp=x^y;//这里是不含进位的加法。0+0=0,0+1=1,1+0=1,1+1=0.可见不含进位的加法其实就是俩个数的异或。
	int tp=(x&y)<<1;//这里是只计算进位后的值。0+0=0,0+1=0,1+0=1,1+1=1.可见只有俩个都是1的时候才进位。由于要进位,所以还要向左移动一位。
	return Add(tmp,tp);//然后将计算的进位和不含进位的和加起来。
}

 

/*
2.不用四则运算计算俩个数的积。
不用四则运算的话,还是要考虑位运算。
比如2*15 (2)=0010 (15)=(1111);
那么其实2*15=(0010)<<0+(0010)<<1+(0010)<<2+(0010)<<3;
换成移位操作。
*/

int Multiplay(int x,int y)
{
	int sum=0;//这个是要返回的
	int count=0;//这个是记录现在是在哪个位
	while(y)
	{
		if((y&1)==1)
			sum+=x<<count;//如果当前位是1,那么说明需要移位。否则不用移位。
		y=y>>1;//y右移取数,直到y等于0.
		count++;//位数增加
	}
	return sum;
}



 

/*
3.计算一个数化为二进制中含有1的个数。
*/
int BitCount(int x)
{
	int count=0;
	while(x)
	{
		if((x&1)==1)
			count++;
		x=x>>1;
	}
	return count;
}


 

/*
4.对一个32位的数循环右移,返回结果。
*/
unsigned int RotateRight(unsigned int x,unsigned int y)
{
	for(int j=y;j>0;j--)
	{
		int i=0;
		if((x&1)==1)
			i=1<<31;
		x=x>>1;
		x+=i;
	}
	return x;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值