• 数学


     

    两个整数相除

    两个整数相除

    将两个整数相除,要求不使用乘法、除法和 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;
    }
  • 相关阅读:
    Java项目(非Web)整合lombok+slf4j1.7.x+log4j 2.x日志框架同时输出到文件和控制台
    2022年面试准备
    前端做微信支付(vue)
    手机端的宽度
    Kubernetes平台上更安全的构建容器镜像工具Kaniko
    软件开发方法论12 factors
    Mysql 优化记录
    微信端浏览器有两个相同名的cookie在shiro引发无法认证问题
    若依系统富文本编辑框内容保存到后台样式被过滤问题
    ts中的void和never类型
  • 原文地址:https://www.cnblogs.com/hesier/p/6022129.html
Copyright © 2020-2023  润新知