Leetcode---Divide Two Integers

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

整数的除法,但无法用乘号,除号和余号。

可以考虑二分,假设A/B, 则解空间在[0, A]

当B*A/2<A时,表明解在[A/2,A]之间==>注意这里A/2可能是解,因为整数的除法是舍去余数的
当B*A /2>A时,表明解在[0, A/2)之间,
当B*A /2==A时,表明解为A/2

不断缩小解空间,最后得到解,这段code是精髓:

  1. while(i>=j){
  2.         long long k=(i+j)>>1;
  3.         long long m=multiply(k,b);
  4.         if(m>a){
  5.             i=k-1;
  6.         }else if(m==a){
  7.             answer=k;
  8.             break;
  9.         }else{
  10.             answer=k;
  11.             j=k+1;
  12.         }
  13.     }
全部代码如下:

  1. long long multiply(long long a, long long b){
  2.     if(a==0)
  3.         return 0;
  4.     else{
  5.         return (multiply(a>>1,b)<<1)+((a&1)?b:0);
  6.     }
  7. }
  8. int f(long long a, long long b){
  9.     int answer=0;
  10.     long long i=a;
  11.     long long j=0;
  12.     while(i>=j){
  13.         long long k=(i+j)>>1;
  14.         long long m=multiply(k,b);
  15.         if(m>a){
  16.             i=k-1;
  17.         }else if(m==a){
  18.             answer=k;
  19.             break;
  20.         }else{
  21.             answer=k;
  22.             j=k+1;
  23.         }
  24.     }
  25.     return answer;
  26. }
  27.     int divide(int dividend, int divisor) {
  28.         long long a=dividend;
  29.         long long b=divisor;
  30.         if(a<0 && b>0)
  31.             return -f(-a, b);
  32.         else if(a>0 && b<0)
  33.             return -f(a, -b);
  34.         else if(a<0 && b<0)
  35.             return f(-a, -b);
  36.         else if(a>0 && b>0)
  37.             return f(a, b);
  38.         else if(a==0)
  39.             return 0;
  40.         else
  41.             return 0xFFFFFFFF;
  42.     }



<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(3) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值