标签:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
这个题分了两种解法,本质都是一样的:
方法一:都是每次减去divisor 的2^i 倍sum,其中sum<=dividend<2*sum;
代码:
1 class Solution { 2 public: 3 int divide(int dividend, int divisor) 4 { 5 int falg=0; 6 bool m=false; 7 if (dividend==0||divisor==0) 8 { 9 return 0; 10 } 11 if ((dividend<0&&divisor>0)||(divisor<0&÷nd>0)) 12 { 13 falg=1; 14 } 15 if (divisor==1) 16 { 17 return dividend; 18 } 19 if (divisor==-1&÷nd==-2147483648) 20 { 21 return 2147483647; 22 } 23 long long div=dividend; 24 if (dividend<0) 25 { 26 div=-div; 27 } 28 long long num=divisor; 29 if (divisor<0) 30 { 31 num=-num; 32 } 33 long long s=num; 34 long long n=1; 35 long long sum=0; 36 while(div>=num) 37 { 38 num=2*num; 39 n=2*n; 40 m=true; 41 } 42 if (m) 43 { 44 num=num/2; 45 n=n/2; 46 } 47 while(div>=s) 48 { 49 if (div>=num) 50 { 51 sum+=n; 52 div=div-num; 53 } 54 num=num/2; 55 n=n/2; 56 } 57 if (falg==0) 58 { 59 if (sum>2147483647) 60 { 61 return 2147483647; 62 } 63 } 64 else 65 return -sum; 66 67 return sum; 68 } 69 };
方法二:本质跟方法一相同,但使用移位代替乘2,所以更快些,我看到其他一些博客中也是同样的代码,只是有些边界条件没有考虑,下面代码加入边界条件,可正确运行。
代码:
class Solution { public: int divide(int dividend, int divisor) { if (dividend==0||divisor==0) { return 0; } if (divisor==1) { return dividend; } if (divisor==-1&÷nd==-2147483648) { return 2147483647; } long long a=dividend; long long b=divisor; int sign = 1; if(a < 0){ a = -a; sign=sign*(-1); } if(b < 0){ b = -b; sign=sign*(-1); } int d = 0; while ( (b << d) <= a ) { ++d; } --d; int res = 0; for (int i = d; i >= 0; --i) { if ( (b << i) <= a ) { res += (1 << i); // high to low a -= (b << i); // remaider } } if(sign * res) return sign * res; } };
在使用时间方面,方法一用时16ms,方法二用时8ms,由此可看出优劣。
标签:
原文地址:http://www.cnblogs.com/zhang-hill/p/5064650.html