LeetCode29 Divide Two Integers
题目:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT. (Medium)
分析:
题目要求不使用乘除和模运算实现两个整数除法。
第一个思路就是每次把count加等被除数自身判定,只到count<=除数,并且count + 被除数 > 除数时即为结果。
但是考虑到可能有 MAX_INT / 1这种情况,肯定华丽超时。
然后考虑使用移位运算,每次将count加等被除数左移一位(*2),满足条件后跳出循环,并且把除数 -= count,再来,只到除数 < 被除数挑出外循环。
注意:
这种数学题不是很好写(从AC率只有15%左右可以看出)。除了想清楚算法本身,
还要注意正负数处理,注意int范围处理(一般改成long long最后再判定比较简便,比如reverse integer)
代码:
1 class Solution { 2 public: 3 int divide(int dividend, int divisor) { 4 long long ldividend = dividend; 5 long long ldivisor = divisor; 6 int flag = 1; 7 if (ldividend < 0) { 8 ldividend = -ldividend; 9 flag = -flag; 10 } 11 if (ldivisor < 0) { 12 ldivisor = -ldivisor; 13 flag = -flag; 14 } 15 long long result = 0; 16 while (ldivisor <= ldividend) { 17 long long count = ldivisor; 18 long long temp = 1; 19 long long tempDividend = ldividend; 20 while ( !(count <= tempDividend && (count << 1) > tempDividend)) { 21 count <<= 1; 22 temp <<= 1; 23 } 24 result += temp; 25 ldividend -= count; 26 } 27 if (flag < 0) { 28 if (result > 0x80000000) { 29 return 0x7FFFFFFF; 30 } 31 else { 32 return -result; 33 } 34 } 35 else { 36 if (result > 0x7FFFFFFF) { 37 return 0x7FFFFFFF; 38 } 39 else { 40 return result; 41 } 42 } 43 44 } 45 };