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;
    }
  • 相关阅读:
    Jenkins-maven项目的构建、部署
    配置管理规范-互联网配置管理特点
    Jenkins-权限控制
    Jira-角色和用户组
    Jira-权限管理
    bat命令生成目录树(包含或不包含文件夹)
    登录QQ出现R6030-CRT not initialized,安装QQ 9.2.0可解决
    pointofix快捷键
    卸载Windows的弹窗广告可尝试使用“广告清道夫”
    激活Windows10专业工作站版
  • 原文地址:https://www.cnblogs.com/hesier/p/6022129.html
Copyright © 2011-2022 走看看