求兩整數相除 29 兩數相除

2021-10-14 17:04:49 字數 1590 閱讀 5975

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。

示例1:

輸入: dividend = 10, divisor = 3

輸出: 3

示例2:

輸入: dividend = 7, divisor = -3

輸出: -2

說明:

1、被除數和除數均為 32 位有符號整數。

2、除數不為 0。

3、假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1]。本題中,如果除法結果溢位,則返回 231 − 1。

這道題看起來似乎很簡單,實則到處都是坑,最直接的思路就是在dividend和divisor都為正數的前提下,迴圈用被除數dividend減除數divisor,減法進行的次數則為最後除法所得的商。因此,需要做一些預處理:1)將dividend和divisor轉化為正數來處理;2)c++中int整型範圍有限,需要轉化為long型來處理,那麼初步**如下:

class solution 

long tmpdividend = (long)dividend;

long tmpdivisor = (long)divisor;

if(tmpdividend < 0)

if(tmpdivisor < 0)

while(tmpdividend >= tmpdivisor)

if(flag)else

}elseelse}}

};

但是很遺憾,oj給的結果是超時:

分析上面演算法的時間複雜度可知,當dividend非常大、而divisor非常小時(比如下圖給出的test case),那while迴圈中需要進行減法的次數將會非常大,時間複雜度為o(dividend),所以有沒有什麼辦法可以減小耗時呢?分析可知,迴圈中每次減的數都是divisor,那是否可以提高減法的效率呢?比如成倍擴大divisor,同時成倍增加減法次數k,**如下:

class solution 

long tmpdividend = (long)dividend;

long tmpdivisor = (long)divisor;

if(tmpdividend < 0)

if(tmpdivisor < 0)

while(tmpdividend >= tmpdivisor)

}if(flag)else

}elseelse}}

};

oj險過,很顯然這個演算法的時間複雜度和空間複雜度依然不太優秀,但是題解區的一些解法思路讓我累覺不愛,有些實在是沒看懂,姑且按這個易懂的思路來吧。

29 兩數相除

這是數學題題啊,老本行。方法一 可以將除法轉移到對數域 b a eln b a e ln b ln a frac ab eln ab e lnb lna c code class solution 方法二 任何乙個整數可以表示成以2的冪為底的一組基的線性組合.分析 可以對被除數進行分解。以 10 和...

29 兩數相除

參考文獻 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。example 輸入 dividend 10,divisor 3 輸出 3 二進位制遞迴 class solution l...

29 兩數相除

29.兩數相除 難度中等321收藏分享切換為英文關注反饋 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。整數除法的結果應當截去 truncate 其小數部分,例如 truncat...