LeetCode-Divdend two Integers

题目:

Divide two integers without using multiplication, division and mod operator.

 

思路分析

二分法.将除数不断增倍,而结果同样扩大两倍,直到除数的值大于被除数.然后再利用被除数减去除数最后增长到小于被除数的值,递归求出结果.

例如:123/4

4<123   4*2=8<123  8*2=16>123    16*2=32<123    

32*2=64<123   64*2=128>123  故结果增长的值为64/4=16.

再利用123-64=59,再次递归求出结果,最后肯定能得出59/4=14,余数为3,3<4抛弃.

故最终值为16+14=30

 

代码:

 1 public Solution{

 2 public:

 3     long long  interDivide(unsigned long long dividend,

 4                       unsigned long long divisor){

 5           if(dividend<divisor) return 0;

 6               

 7           long long result=1;

 8           unsigned long long tmp=divisor,left;

 9           

10           while(tmp<=dividend){

11                  left=dividend-tmp;

12                  tmp<<=1;

13                  

14                  if(tmp>dividend){

15                        break;

16                  }

17                  

18                  else{

19                        result<<=1;

20                  }

21           }

22           

23           return result+interDivide(left,divisor);

24     }

25     

26     int Divide(int dividend,int divisor){

27           unsigned long long _dividend=abs((long long)dividend);

28           unsigned long long _divisor=abs((long long)divisor);

29           

30           bool positive=((dividend>=0) && (divisor>0)) || ((dividend<=0) && (divisor<0));

31           

32           return positive?interDivide(_dividend,_divisor):(-1)*interDivide(_dividend,_divisor);

33           

34     }

35 };

之所以用unsigned long long是为了防止溢出.

 

你可能感兴趣的:(LeetCode)