/*
* F**K the corner cases...
*/
int negate(int i) { return (~(i)+1); }
int divide(int dividend, int divisor) {
if (divisor == dividend) return 1;
if (divisor == 1) return dividend;
if (divisor == -1) return dividend == INT_MIN ? INT_MAX : negate(dividend);
if (dividend == 0) return 0;
int pow = 1, shifts = 1, nd = divisor > 0 ? divisor : (divisor != INT_MIN ? negate(divisor) : 3);
while (shifts < 32 && pow < nd && (pow <= INT_MAX >> shifts) && (pow <<= shifts) != nd) shifts++;
if (dividend > 0 && divisor > 0) {
if (pow == divisor) { return dividend >> shifts; }
int ret = 0;
while ((dividend -= divisor) >= 0) {
if (ret == INT_MAX) {
return INT_MAX;
} else {
ret++;
}
}
return ret;
} else if (dividend > 0 && divisor < 0) {
if (pow == nd) { return negate(dividend >> shifts); }
int ret = 0;
while ((dividend += divisor) >= 0) {
if (ret == INT_MIN) {
return INT_MIN;
} else {
ret--;
}
}
return ret;
} else if (dividend < 0 && divisor > 0) {
if (pow == nd) { return dividend >> shifts; }
int ret = 0;
while ((dividend += divisor) <= 0) {
if (ret == INT_MIN) {
return INT_MIN;
} else {
ret--;
}
}
return ret;
} else {//all < 0
if (pow == nd) { return negate(dividend) >> shifts; }
int ret = 0;
while ((dividend -= divisor) <= 0) {
if (ret == INT_MAX) {
return INT_MAX;
} else {
ret++;
}
}
return ret;
}
}
LeetCode #29 Divide Two Integers
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- (两个整数相除,不用乘除取余算术符) Divide two integers without using mult...
- Divide Two IntegersGiven two integers dividend and diviso...
- 29 Divide Two Integers 两数相除 Description:Given two integer...
- 题目 不使用乘, 除, 模运算, 实现除法运算. 思路 不使用乘法, 除法, 取模运算, 就要想到使用位运算. 位...