zoukankan      html  css  js  c++  java
  • Divide Two Integers

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

    思路:

    这道题属于数值处理的题目,对于整数处理的问题,在Reverse Integer中我有提到过,比较重要的注意点在于符号和处理越界的问题。对于这道题目,因为不能用乘除法和取余运算,我们只能使用位运算和加减法。比较直接的方法是用被除数一直减去除数,直到为0。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。

    那么有没有办法优化呢? 这个我们就得使用位运算。我们知道任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基。然后接下来我们每次尝试减去这个基,如果可以则结果增加加2^k,然后基继续右移迭代,直到基为0为止。因为这个方法的迭代次数是按2的幂直到超过结果,所以时间复杂度为O(logn)。num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n,其中num作为被除数,而a_0 a_1 ... a_n作为除数是一样的,这样算出的商也就是这些除数的系数之和。

    例如:如果100除以2,可以用100=2*2+2*2^4+2*2^5计算出来。首先将2左移最大的k位,使得有2*2^k小于100,然后将100-2*2^k,即为36,然后继续计算使得2*2^k小于36的最大值,依次下去。

    注意其其中处理溢出的方法,由于INT_MIN转换为正数之后会溢出,因此将转换的数先减去一个除数,同时将商增加1.

    C++实现代码:

    #include<iostream>
    #include<climits>
    #include<cmath>
    using namespace std;
    
    class Solution
    {
    public:
        int divide(int dividend, int divisor)
        {
            unsigned int divid,divis;
            long long res=0;
            if(dividend==INT_MIN)
            {
                res = 1;
                dividend +=abs(divisor);
            }
            divid=abs(dividend);
            divis=abs(divisor);
            while(divid>=divis)
            {
                int digit = 0;
                while(divis<=divid)
                {
                    divis<<= 1;
                    digit++;
                }
                divid-=divis>>1;
                res+=1<<(digit-1);
                divis=abs(divisor);
            }
            return (dividend>0)^(divisor>0)?-res:res;
        }
    };
    int main()
    {
        Solution s;
        cout<<s.divide(-2147483648,2)<<endl;
    }
  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4125055.html
Copyright © 2011-2022 走看看