被除數÷除數=商+餘數
需要注意的問題:
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 這些法則與加法是相同的,只是不帶進製,所以異或常被...