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;
}
}
就是這莫簡單與無聊,中等的題目,慢慢來還是非常簡單的,以後大家一起加油。
相關文章
- LeetCode 29——兩數相除LeetCode
- python LeetCode 兩數相除PythonLeetCode
- JAVA-LeetCode中等29兩數相除JavaLeetCode
- 力扣第29題 中等難度 兩數相除力扣
- 求最大公約數(輾轉相除法)
- 輾轉相除法
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- [LeetCode] 29. Divide Two IntegersLeetCodeIDE
- 【leetcode】29. Divide Two Integers 不能使用乘除法的整數除法LeetCodeIDE
- 輾轉相除法原理
- 課時29.錨點(掌握)
- 輾轉相除法的原理
- 輾轉相除法與更相減損術(求最大公約數)
- 29. 多執行緒程式設計執行緒程式設計
- 29.蚊香一言好用愛用
- 透徹理解輾轉相除法
- 輾轉相除法 氣泡排序排序
- 輾轉相除法原理解析
- 兩數之和
- 29. 使用MySQL之資料庫維護MySql資料庫
- C++中的輾轉相除法C++
- 【C語言】聊聊輾轉相除法C語言
- LeetCode - 兩數之和LeetCode
- 兩數之和(TwoSum)
- 兩數相加Ⅰ和Ⅱ
- Leetcode兩數相加LeetCode
- LeetCode——兩數相加LeetCode
- LeetCode:兩數之和LeetCode
- LeetCode-兩數之和LeetCode
- LeetCode-兩數相加LeetCode
- 2. 兩數相加
- 1. 兩數之和
- leetcode #1 兩數之和LeetCode
- LeetCode 1 兩數之和LeetCode
- LeetCode之兩數之和LeetCode
- 【leetcode】【2、兩數相加】LeetCode
- LeetCode 2——兩數相加LeetCode
- 【LeetCode】2 兩數相加LeetCode