leetcode 29 link
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Note:
Both dividend and divisor will be 32-bit signed integers.
The divisor will never be 0.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [?231, 231 ? 1]. For the purpose of this problem, assume that your function returns 231 ? 1 when the division result overflows.
這題 就是 用 加減法 實現(xiàn) 兩數(shù)相除 ( 就是只能用 位運算 )
比如 10 /3 就是 10-3-3-3 =1 < 3 的過程, divisor 3 被減去了3次泪姨, 所以商為3.
如果 每次只減去 divisor 復(fù)雜度 為 O(n)游沿,
顯然可以優(yōu)化到 O(logn)。 就是 加減的過程中肮砾, 讓divisor 不斷 乘2 或者除2.
這里我簡單寫了下诀黍。。
#include <cmath>
class Solution {
public:
int divide(int dividend, int divisor) {
// 整數(shù)減法
long dividend_l = dividend;
long ret = 0;
int count = 1;
long divisor_change = divisor;
// 符號
bool flag = (dividend>0 &&divisor>0 )||(dividend<0 && divisor<0)? true:false;
// abs
dividend_l = abs(dividend_l);
divisor_change = abs(divisor_change);
// dividend <= divisor || divisor = 1
if(dividend_l < divisor_change){ return 0;}
if(dividend_l == divisor_change) { return flag?1:-1;}
if(divisor_change == 1){
if(flag){
return dividend_l> pow(2,31)-1 ? pow(2,31)-1 : dividend_l;
}
return -dividend_l;
}
// nlogn divisor>>1
while(dividend_l >= divisor_change){
dividend_l-=divisor_change;
ret+=count;
count<<=1; divisor_change<<=1;
}
while( dividend_l >=abs(divisor)){
count>>=1;divisor_change>>=1;
if(dividend_l >=divisor_change){
dividend_l-=divisor_change;
ret+=count;
}
}
// positive overflow
ret = flag?ret: -ret;
return ret> pow(2,31)-1? pow(2,31)-1 : ret;
}
};