【LeetCode】29. 两数相除
1 class Solution { 2 public: 3 int divide(int a,int b) { 4 if (b == -1) 5 { 6 if(a == INT_MIN) 7 return INT_MAX; 8 return -a; 9 } 10 if (a!=INT_MIN && b== INT_MIN) 11 return 0; 12 if (a==b) 13 return 1; 14 if (b == 1) 15 return a; 16 if (a==-b) 17 return -1; 18 19 int sign = 0; 20 if ((a > 0 && b < 0) || (a < 0 && b > 0)) 21 sign = 1; 22 23 if (a > 0) 24 a = -a; 25 if (b > 0) 26 b = -b; 27 28 int base = 1, cp = b,ans=0; 29 30 while (a <= b) 31 { 32 cp=b; //存一下当前循环的除数 33 base = 1; 34 while(cp>=0xc0000000&&a<=cp+cp) //0xc0000000表示INT_MIN的一半 35 { 36 base+=base; 37 cp+=cp; 38 } 39 ans+=base; 40 a-=cp; 41 } 42 43 if(sign) 44 return -ans; 45 return ans; 46 } 47 };
主要思想首先对可能超时或者溢出的结果进行特殊判定。
对需要进行计算的值,找到最接近被除数a的2^k值,a>cp+cp时则找到了这个值,否则cp和商扩倍;
当找到了这个商后,则加到结果中,被除数减去这个商,继续重复这个循环,直到被除数大于除数,返回结果。
这是一种优化算法,效率接近logn,前面带一常数但不是n

浙公网安备 33010602011771号