29.兩數相除

比卡丘不皮發表於2020-12-21

兩數相除

給定兩個整數,被除數 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;
	}


}

就是這莫簡單與無聊,中等的題目,慢慢來還是非常簡單的,以後大家一起加油。

相關文章