Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121171
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-24 16:22
文章存档

2014年(53)

我的朋友

分类: C/C++

2014-10-07 14:23:17

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

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

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

当B*A/2注意这里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.     }



阅读(872) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~