zoukankan      html  css  js  c++  java
  • 数学

     

    两个整数相除

    两个整数相除

    将两个整数相除,要求不使用乘法、除法和 mod 运算符。如果溢出,返回 2147483647 。

    (一)利用减法。超时

    public int divide(int divident, int divisor) {
        if(divident == 0){
            return 0;
        }
        if(divident == divisor){
            return 1;
        }
    
        if(divisor == 1){
            return divident;
        }
    
        if(divisor == -1){
            if(divident == Integer.MIN_VALUE) {
                return Integer.MAX_VALUE;
            }
            return -divident;
        }
    
        int count = 0;
        int flag1 = 1;
        int flag2 = 1;
    
        if(divident < 0){
            flag1 = -1;
            divident = -divident;
        }
    
        if(divisor < 0){
            flag2 = -1;
            divisor = -divisor;
        }
    
        while (divident >= divisor){
            divident -= divisor;
            count += 1;
        }
        return count * flag1 * flag2;
    }

    (二)一次一次加会超时,改进:每次将被除数增加1倍,同时将count也增加一倍,如果超过了被除数,那么用被除数减去当前和再继续本操作。。。但这个也会超时

    public int divide(int divident, int divisor) {
        if(divident == 0){
            return 0;
        }
        if(divident == divisor){
            return 1;
        }
    
        if(divisor == 1){
            return divident;
        }
    
        if(divisor == -1){
            if(divident == Integer.MIN_VALUE) {
                return Integer.MAX_VALUE;
            }
            return -divident;
        }
    
        int count = 0;
        int flag1 = 1;
        int flag2 = 1;
    
        if(divident < 0){
            flag1 = -1;
            divident = -divident;
        }
    
        if(divisor < 0){
            flag2 = -1;
            divisor = -divisor;
        }
    
        while (divident >= divisor){
            int doubleDivisor = divisor;
            int count1 = 1;
            while(2 * doubleDivisor <= divident){
                count1 *= 2;
                doubleDivisor *= 2;
            }
            divident -= doubleDivisor;
            count += count1;
        }
        return count * flag1 * flag2;
    }

    (三)改进二的方法,利用位运算

    public int divide(int dividend, int divisor) {
        if(divisor == 0)
            return Integer.MAX_VALUE;
        if(divisor == -1 && dividend == Integer.MIN_VALUE)
            return Integer.MAX_VALUE;
    
        int count = 0;
        long pDividend = Math.abs((long)dividend);
        long pDivisor = Math.abs((long)divisor);
    
        while(pDividend >= pDivisor){
            int count1 = 0;
            while((pDivisor<<count1)<= pDividend){
                count1++;
            }
            count += 1<<(count1 - 1);
            pDividend -=(pDivisor<<(count1 - 1));
        }
        if( dividend >0 && divisor >0 || dividend<0 && divisor<0)
            return count;
        else
            return -count;
    }
  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/hesier/p/6022129.html
Copyright © 2011-2022 走看看