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

2021-10-05 15:08:44 字數 1355 閱讀 8500

題目要求:

給定兩個整數,被除數 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

題目思路:

因為不能使用乘法和除法,所以要使用位運算來實現,具體如下:

根據泰勒公式,每個數都可以被表示為:

number = a0 * 2^0 + a1 * 2^1 + a2 * 2^2 + … + an * 2^n + …

所以我們先找到二進位制的最高位,使用乙個迴圈來實現

//cmp是除數,partial_sum初始化為1, a是被除數

while

((cmp <<1)

< a)

找到二進位制最高位後,又開始往低位迴圈,cmp和partial_sum同時右移,當cmp>a時,跳出內部迴圈,對a和res進行更新,然後繼續,直到a//abs_divisor除數

while

(a >= abs_divisor)

}**實現:

class

solution

else

long a =

abs(dividend)

, cmp =

abs(divisor)

;long res =

0, partial_sum =1;

int abs_divisor = cmp;

if(a < cmp)

return0;

//找到二進位制最高位

while

((cmp <<1)

< a)

while

(a >= abs_divisor)}if

(sign ==1)

else}}

;

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

被除數 除數 商 餘數 需要注意的問題 int 的範圍是 2 31,2 31 1 也就是 2147483648,2147483647 如果 2147483648 1結果會超出int 範圍。除法,乘法和mod都不能使用,那可以使用加減,移位。只需保留商即可 保證資料在int範圍。電腦做二進位制除法的時...

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

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

大數乘法和大數除法模板

找個時間整理一下 下次留著用,主要是大數乘法和大數除法的 坑了爹乙個下午,很多的細節都疏忽了。反轉字串函式,方便索引各位數 void reverse char c for while c 處理進製,直到進製為0 while for 將兩個乘數和乘積都改為大端法 reverse dest revers...