1. 題目
2. 解答
2.1. 方法一
題目要求不能使用乘法鹦倚、除法和除余運(yùn)算,但我們可以將除法轉(zhuǎn)移到對(duì)數(shù)域初婆。
這樣就轉(zhuǎn)化為指數(shù)裹粤、對(duì)數(shù)和減法運(yùn)算了。因?yàn)橹荒軐?duì)正整數(shù)取對(duì)數(shù)官撼,因此我們首先要將兩個(gè)數(shù)都取絕對(duì)值愧哟,最后再加上符號(hào)。
同時(shí)橡淑,題目要求只能存儲(chǔ) 32 位有符號(hào)整數(shù)构拳,因此,當(dāng)數(shù)據(jù)大于上邊界時(shí)梁棠,需要進(jìn)行特殊處理置森。
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == 0) return 0;
double a = fabs(dividend);
double b = fabs(divisor);
long result = exp(log(a) - log(b));
if ((dividend < 0) ^ (divisor < 0)) result = -result;
if (result > INT_MAX) result = INT_MAX;
return result;
}
};
2.2. 方法二
利用移位操作》看下面的例子:
我們可以對(duì)被除數(shù)進(jìn)行分解凫海。以 10 和 3 為例,首先我們確定 3 的最高次系數(shù)男娄, &&
行贪,因此最高次系數(shù)為 2。然后我們用 10 減去
模闲,繼續(xù)進(jìn)行剛才的過程建瘫,
&&
,第二高次系數(shù)為 1尸折。我們循環(huán)進(jìn)行這個(gè)過程啰脚,直到最后的數(shù)小于除數(shù)為止,這些除數(shù)前面所有系數(shù)的和即為所求实夹。
class Solution {
public:
int divide(int dividend, int divisor) {
long a = labs(dividend); // long 型數(shù)據(jù)占 8 個(gè)字節(jié)橄浓,labs() 函數(shù)對(duì) long 求絕對(duì)值
long b = labs(divisor);
long temp = b;
long result = 0;
long cnt = 1;
while (a >= b)
{
cnt = 1;
temp = b;
while (a >= (temp << 1))
{
temp = temp << 1;
cnt = cnt << 1; // 表征除數(shù)前面的各次系數(shù)
}
a -= temp;
result += cnt;
}
if ((dividend < 0) ^ (divisor < 0)) result = -result;
if (result > INT_MAX) result = INT_MAX; // INT_MAX = 2^32 - 1
return result;*/
}
};