29.两数相除

两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

 

 示例 1:

 输入: dividend = 10, divisor = 3
 输出: 3
 解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
 示例 2:

 输入: dividend = 7, divisor = -3
 输出: -2
 解释: 7/-3 = truncate(-2.33333..) = -2

 解题思路,当限制了乘法,除法,还有 取余mod,我们会考虑到位移,位移就相当于乘除法,只不过是以2的倍数, 这就需要一点数学功底了,不过从小学学习就知道乘法的基本就是加法,而除法的本质是乘法。这样我们使用加法,减法就可以实现乘除法的功能。本题目要么考察位运算,要么考察乘法的基本写法。

有关二进制数的写法是:

K = b0 * 2^0 + b1 * 2^1 + b2 * 2^2 + ... + bn * 2^n + ...

然后判断超过的数据与 被除数减去没有超过部分谁大,大的要加上1,小于就不加

如  8  3 。 我们知道2*3为6  8-6为2  2<3, 就不加结果为2.

在如 10  3 我们知道位移是2的倍数,当为4就超过了,所以还是2, 10 - 6 = 4   4< 3 ,所以在2+1 = 3所以为3.

 代码:

int divide(int dividend, int divisor) 
{
	int sign;
	if ((dividend >= 0 && divisor > 0) || (dividend <= 0 && divisor < 0)) {
		sign = 0;
	}
	else {
		sign = 1;
	}
	long a = abs(dividend), cmp = abs(divisor);
	long res = 0, partial_sum = 1;
	int abs_divisor = cmp;
	if (a < cmp) return 0;
	while ((cmp << 1) < a) {
		cmp = cmp << 1;
		partial_sum = partial_sum << 1;
	}
	while (a >= abs_divisor) {
		a -= cmp;
		res += partial_sum;
		while (cmp > a) {
			cmp = cmp >> 1;
			partial_sum = partial_sum >> 1;
		}
	}
	if (sign == 1) {
		if (-res < INT_MIN) return INT_MAX;
		else return -res;
	}
	else {
		if (res > INT_MAX) return INT_MAX;
		else return res;
	}


}

就是这莫简单与无聊,中等的题目,慢慢来还是非常简单的,以后大家一起加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值