不使用乘法 除法或mod,實現兩數相除

2021-10-07 15:17:10 字數 2087 閱讀 7278

被除數÷除數=商+餘數

需要注意的問題:

int 的範圍是[-2^31,2^31-1],也就是【-2147483648,2147483647】,如果-2147483648/-1結果會超出int 範圍。

除法,乘法和mod都不能使用,那可以使用加減,移位。

只需保留商即可

保證資料在int範圍。

電腦做二進位制除法的時候,是讓被除數連續減去幾次除數(減去n倍除數),直到差小於除數時為止,這樣減去的次數就是商,剩下的差就是餘數。

可以借鑑這個思想。

當然被除數減去除數也可以。

如 10/3,除數自增,10在【3+3+3,3+3+3+3】範圍裡面。

如果被除數取得很大,除數取得很小,那麼會很慢。(二者同號情況下)

下面**有個錯誤,就是int會溢位。

class

solution

int ans=1;

//商int f=-1

;//兩個數是否異號

if(dividend<

0&&divisor<

0||dividend>

0&&divisor>

0) f=1;

if(f==-1

)int temp=0;

int d=divisor;

while

(true

) temp=divisor;

divisor+=d;

ans++;}

}}

注意math.abs()原始碼

public

static

intabs

(int a)**

****

****

****

****

****

****

****

****

****

**public

static

long

abs(

long a)

所以引數需要強轉一下。

dividend/2^n來減少減法的次數。(加法和減法的原理一樣)

dividend/2^n>=divisor的時候,說明dividend-divisor*2^n>=0

於是可以用dividend-=divisor*2^n來簡化。

這樣每次最多迴圈32次。

class

solution

}return f*ans;

}}

那這個演算法的正確性如何呢?

解法二和解法三乙個是》,乙個是<<。

道理一樣。

大致思路:每次讓dividend=dividend-n*divisor(且每次的n取值盡可能大)

此題限制,我們可以用位移運算,此時的n一定是2的倍數。那麼和解法二差不多。

所以首先讓diviosor>dividend,然後開始計算。

class

solution

while

(count>0)

}return f*ans;

}}

當然注意題目所說的資料都是int範圍的,所以不用long

class

solution

else

if(dividend==0)

return ans*f;

}else

if(divisor==integer.min_value)

return0;

int c_divisor=math.

abs(divisor)

;int c_dividend=math.

abs(dividend)

;for

(int i=

31;i>=

0;i--)}

return f*ans;

}}

不使用乘法和除法和mod實現兩數相除

題目要求 給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。整數除法的結果應當截去 truncate 其小數部分,例如 truncate 8.345 8 以及 trun...

不使用乘法除法迴圈遞迴做累加操作

題目 求1 2 n,要求不能使用乘法除法 for while if else switch case等關鍵字字及其條件判斷語句。方法一 建構函式class temp static int getsum static void reset unsigned int temp num 0 unsigne...

使用異或實現兩數交換

如果a b兩個值不相同,則異或結果為1。如果a b兩個值相同,異或結果為0。異或也叫半加運算,其運算法則相當於不帶進製的二進位制加法 二進位制下用1表示真,0表示假,則異或的運算法則為 0 0 0,1 0 1,0 1 1,1 1 0 同為0,異為1 這些法則與加法是相同的,只是不帶進製,所以異或常被...