zoukankan      html  css  js  c++  java
  • Divide Two Integers(模拟计算机除法)

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

    由于不能用乘号,除号,和取余。那么一个数除另外一个数,如a/b,实际含义是a中有多少个b,我们可以多次计算a-b,并更新a,最后a-b<0说明循环结束,循环的次数也即结果。

    但是上面这种方法超时,如2147483647/1,那么循环次数为2147483647次。

    所以考虑二分法来减少循环的次数。而且乘2,相对于左移一位,没有用到乘号。

    代码:

    class Solution {
    private:
        int res;
    public:
        int solve(long long dividend, long long divisor){
            long long temp=1;
            while (divisor<=dividend)
            {
                divisor=divisor<<1;
                temp=temp<<1;
            }
            divisor=divisor>>1;
            temp=temp>>1;
            res+=temp;
    
            return dividend-divisor;
    
        }
        int divide(int dividend, int divisor) {
            res=0;
            bool fu=false;
            if(divisor==0) return -1;
            if(divisor==1) return dividend;
    
            long long my_dividend=(long long)dividend;
            long long my_divisor=(long long)divisor;
            if(my_dividend<0&&my_divisor<0){
                my_dividend=0-my_dividend;
                my_divisor=0-my_divisor;
                fu=false;
            }
            if(my_dividend<0) {my_dividend=-my_dividend;fu=true;}
            if(my_divisor<0) {my_divisor=-my_divisor;fu=true;}
    
            while (((my_dividend=solve(my_dividend,my_divisor))-my_divisor)>=0);
    
            if(fu) res=-res;
            return res;
        }
    };
    int main()
    {
        freopen("C:\Users\Administrator\Desktop\a.txt","r",stdin);
        Solution so;
        int a=0-2147483648;
        int b=0-1017100424;
        cout<<so.divide(a,b)<<endl;
        return 0;
    }
  • 相关阅读:
    call、apply、bind函数的理解以及手写。
    父div里两个子div(inline-block),为什么两个子div中间会有小缝隙,如何解决?
    手写柯里化
    arguments的理解
    New
    BFC
    useCallBack和useMemo的用法
    观察者模式和发布订阅模式
    grid布局
    Android常见输入法的包名和主类名
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4110050.html
Copyright © 2011-2022 走看看