思路:不能单步减法,时间会超时。当第一次减完后被减数仍大减数,这时减数可采用2的指数增加,直到大于被减数后,被减数缩小,再次重新这个过程。
注意调试时,出现的错误:
int dividend = -2147483648;
long b=-dividend;(其实b仍等于 -2147483648,因为右边-dividend其实已经运算过后,越界后的值赋给左边)
还有循环内的b,count 仍要为long型,因为可能相加过后越界。
1 class Solution { 2 public: 3 int divide(int dividend, int divisor) { 4 int MAX_INT=2147483647; 5 if(divisor==0||(dividend==-(MAX_INT+1)&&divisor==-1)) return MAX_INT; 6 if(dividend==0) return 0; 7 int flag=1,count=1,a; 8 long long dend=dividend; 9 long long sor=divisor; 10 long long b; 11 int quotient=0; 12 if(dividend<0){ flag=-flag; dend=-dend;} 13 if(divisor<0){ flag=-flag; sor= -sor;} 14 if(dend<sor) return 0; 15 while(dend>=sor) 16 { 17 count=1; 18 b=sor; 19 while(b+b<=dend) 20 { 21 b+=b; 22 count+=count; 23 } 24 dend-=b; 25 quotient+=count; 26 } 27 if(flag<0) quotient=-quotient; 28 return quotient; 29 } 30 };