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 };

 

posted @ 2016-08-17 22:18  wangxiaobao1114  阅读(146)  评论(0编辑  收藏  举报