• Divide Two Integers


     1 int divide(int dividend, int divisor) {
     2     if(divisor==0)return INT_MAX;
     3     if(dividend==0)return 0;
     4     long long res=0;
     5     int flag=1;
     6     long long d1=dividend;
     7     long long d2=divisor;
     8     if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))flag=0;
     9        if(d1<0)d1=-d1;
    10        if(d2<0)d2=-d2;
    11        if(d2>d1)return 0;
    12        int i=0; 
    13        long long d3=d2;
    14        while(d1>=d3){
    15            d2=d3;
    16            i=0;
    17            while(d1>=d2){
    18             d1=d1-d2;
    19             if(d1>=0)res=res+(1<<i);
    20             d2<<=1;
    21             i++;
    22         }
    23     }
    24     if(flag==0)res=0-res;
    25     if(res<INT_MIN||res>INT_MAX)return INT_MAX;
    26     return res;
    27 }
    View Code

    学过计算机组成原理的都知道,在计算机内部是没有乘除的,计算机内部的算术运算只有加减,而加减又可以都当做是一种操作。计算机组成原理中介绍除法运算的时候会介绍一种较辗转相减的方法,就是将两个相除的数据取正,用大的那个循环减去小的那个,直到出现负值,并且没减一次,count++,最后的count就是结果。这种方法的局限性在与,每次都只减去一个除数,这样的话,循环的次数太多,浪费时间。我们要做的就是在每次减去除数的时候,都将它扩大一倍。举例来说:

    a/b=?

    a=100,b=2,count=0

    第一次 a-=b b<<=1 (a=98,b=4,count+=1)

    第二次 a-=b b<<=1 (a=94,b=8,count+=2)

    第三次a-=b b<<=1 (a=78,b=16,count+=4)

    ...

    ...

    第一次count只加1的原因是,只减去一个b

    第二次count加2的原因是,减去了2个b

    第三次,则是减去了4个b

    特别注意的是上面的循环只是一次的循环,b每次扩大2倍,总会大于a,只要跳出循环,参数重置,再次进行循环知道a小于初始的b即可。

  • 相关阅读:
    安装高版本的docker
    Apache JMeter汉化手册
    安装python包
    Jmeter Cluster
    doc下设置永久环境变量的好方法
    jmeter非常好的博客收藏
    mysql-学习链接
    python 脚本
    常见python快捷键
    2015年心情随笔--周围太烦躁,我想静静
  • 原文地址:https://www.cnblogs.com/lichao-normal/p/6105518.html
Copyright © 2020-2023  润新知