Cの実装分割
ソース
Leetcode上の問題、非常に有意義な感じの後に行うので、記録します。
実際、彼は分裂を達成するための方法の多くにアクセスされ、最終的に私はこれが最善の方法であると感じ、ない他の理由のため、高速です。
注意すべき点がいくつかあり
- 正の整数間の相互運用性は、したがって、我々はいくつかの国境問題を考慮する必要があり、さらに便利になります。INTの範囲は[-2e31,2e31-1]、従って、陽性に-2e31場合、int型の範囲を超えているように、最善の解決策は、長いlong intに変換されます。
- もちろん、これは定義されたあなたのOSのロングレンジに依存し、long intに変換することができます。
- 数になるとは対照的に、選択0-xがより便利であろう。
- ^ XOR演算子の使用は、プロセスをスピードアップすることができます。
- 範囲を超えそうなので、それぞれの変数の型は、advisedly必要があります。
コード
int divide(int dividend, int divisor){
long long int y = (long long int)dividend;
long long int x = (long long int)divisor;
if(y < 0) y = 0 - y;
if(x < 0) x = 0 - x;
long long int tmp, one = 1, res = 0;
int restmp;
while(y >= x){
restmp = 0;
tmp = x;
while(y >= tmp){
tmp = tmp << 1;
restmp ++;
}
restmp --;
y -= (x << restmp);
res += (one << restmp);
}
if((dividend > 0)^(divisor > 0))
res = 0 - res;
if(res > 2147483647 || res < -2147483648)
res = 2147483647;
return res;
}