• 【Leetcode】


        实现两个整数的除法,不许用乘法、除法和求模。题目被贴上了BinarySearch,但我没理解为什么会和BinarySearch有关系。我想的方法也和BS一点关系都没有。

        很早以前我就猜想,整数的乘法是不是总是可以用移位和加法来实现?当然可以了,任何整数都可以写成2n或2n+1的形式,移位就是那个乘以2,加法就是最后的+1了嘛。复杂度是O(1),因为整数的移位最多32次,因此在循环中移位的次数也极其有限。

        例如123/5:

    5    123

    <<1

    <<1

    <<1

    <<1

    5*16 = 80

    5    123-80=43

    <<1

    <<1

    <<1

    5*8 = 40

    5    43-40=3

    5<3, thus result = 16+8 = 24

    (if dividend == 125, finally we have:

    5==5, thus result = 16+8+1 = 25;)

    于是:

        int divide(long long a, long long b) {
            if(b==0) return a>=0?0x7fffffff:0x80000000;
            if(a==0) return 0;
            if(b==1) return a;
            int sgn = (a^b) & 0x80000000; //0 -> +,  0x80000000 -> -
            if(a<0) a=-a;
            if(b<0) b=-b;
            //a,b>0
            if(a<b) return 0;
            int res = 0, _b = b, twon;
            while(a>b)
            {
                twon = 1;
                while(a>b)
                {
                    b<<=1;
                    twon<<=1;
                }
                b>>=1;
                twon>>=1;
                a -= b;
                b = _b;
                res += twon;
            }
            if(a==b) res++;
            if(sgn) 
                return -res;
            else return res;
        }

         Leetcode上测试时间为36ms。

        这里玩了一个小trick,用long long而不是int来存变量了,主要是防止被除数太大时除数移位会溢出变成负数。当然去掉long long也不难啦,加上溢出的判断就好了。只不过,这里的溢出判断和函数atoi是有所不同的,atoi中的result每次乘以10再加上0-9,而这边是乘以2。以上。

  • 相关阅读:
    SQL点滴34—SQL中的大小写
    js关闭和打开页面
    jquery处理checkbox
    CKeditor 配置使用
    .net4.0中的ClientIDMode
    FCKEditor使用说明
    SQL对Xml字段的操作 拓荒者
    c#中BackGroundWorker控件 拓荒者
    C#中DataGradView控件的常用操作 拓荒者
    JavaScript操作Xml 拓荒者
  • 原文地址:https://www.cnblogs.com/zhchngzng/p/4100220.html
Copyright © 2020-2023  润新知