[leetcode]Divide Two Integers

Divide Two Integers

题意:写一个整数之间的除法,不可以用* / %运算符

解法:

         O(1):最暴力的方式一定是不停的试商,那么商的范围是连续的,所以一定可以采用二分的方式进行尝试,但因为题中要求不可以用*,所以要自己去实现一个mul(a,b),当然采用位运算。每次乘法计算由于int位数是常数,所以是O(1)的,而商的范围是int,所以log(2^31)也是常数,所以整个算法复杂度是O(1).

public class Solution124 {
   public int divide(int dividend, int divisor) {
             long dividend2=dividend;
             long divisor2=divisor;
             if (dividend2==0){
                       return 0;
             }
             if (divisor2==0){
                       return 0;
             }
             boolean label=false;
             if(dividend2<0&&divisor2>=0){
                       label=true;
             }
             if(dividend2>=0&&divisor2<0){
                       label=true;
             }
             if (dividend2<0){
                       dividend2=-dividend2;
             }
             if (divisor2<0){
                       divisor2=-divisor2;
             }
             if (dividend2==divisor2){
                       return label?-1:1;
             }
             if (dividend2<divisor2){
                       return 0;
             }
             if (divisor2==1){
                       returnlabel?(int)(-dividend2):(int)dividend2;
             }
             longtemp=binarySearch(dividend2,divisor2,1,dividend2-1);
             return label?(int)(-temp):(int)temp;
    }
         privatelong binarySearch(long dividend2,long divisor2,long x, long y) {
                   if(myMul(x,divisor2)==dividend2){
                            returnx;
                   }
                   if(myMul(y,divisor2)==dividend2){
                            returny;
                   }
                   longmid=(x+y)>>1;
                   if(myMul(mid,divisor2)==dividend2){
                            returnmid;
                   }
                   if(myMul(y,divisor2)<dividend2){
                            returny;
                   }
                   if(y-x==1){
                            returnx;
                   }
                   if(myMul(mid,divisor2)>dividend2){
                            returnbinarySearch(dividend2,divisor2,x,mid);
                   }else{
                            returnbinarySearch(dividend2,divisor2,mid,y);
                   }                
         }
         publiclong myMul(long x,long y){
                   longans=0;
                   for(int i=1;i<32;i++){
                            longnewY=y>>i<<i;
                            if(y-newY>0){
                                     ans+=x<<(i-1);
                            }
                            y=newY;
                   }
                   returnans;
         }
}
 


另外一种解法:每次将除数不停的扩大一倍,直到超过被除数,用被除数减去对应的数,并把这部分的结果加入ans,重复迭代,直到除数不扩大也大于被除数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值