• 29. 两数相除


    29. 两数相除

    移位

    1. 任何正整数都可以用 Math.pow(2,0)+Math.pow(2,1)+...+Math.pow(2,n) 表示。
    2. 利用 10/3 =(6+4)/3=2+1=3求解 为了方便计算需要把数都转化为正数,为了防止数值溢出int,转换为long。
    public class Solution2
    {
        public int Divide(int dividend, int divisor)
        {
            //先判断特殊情况
            if (divisor == 0 || dividend == 0) return 0;
            if (dividend == Int32.MinValue && divisor == -1) return Int32.MaxValue; //防止越界
            //利用 10/3 =(6+4)/3=2+1=3求解 为了方便计算需要把数都转化为正数,为了防止数值溢出int,转换为long。
            int sign1 = 1;
            int sign2 = 1;
            int answer = 0;
            long dividendLong = dividend;
            long divisorLong = divisor;
            if (dividend < 0)
            {
                sign1 = -1;
                dividendLong *= -1;
            }
    
            if (divisor < 0)
            {
                sign2 = -1;
                divisorLong *= -1;
            }
    
            for (int i = 31; i >= 0; i--)
            {
                if (divisorLong << i <= dividendLong)
                {
                    dividendLong -= divisorLong << i;
                    answer += (1 << i);
                }
            }
    
            return answer * sign1 * sign2;
        }
    }
    
    public class Solution3
    {
        private int Search(int m, int n)
        {
            if (m > n) return 0; //当被除数比除数的绝对值还小的时候结束
    
            int k = -1, t = n;
            while (m < t && m - t < t) //m-t<t 不能修改成 m<2t (可能会越界)
            {
                //使用2的幂次进行求解
                t = t << 1;
                k = k << 1;
            }
    
            return k + Search(m - t, n);
        }
    
        public int Divide(int dividend, int divisor)
        {
            int mFlag = dividend > 0 ? -1 : 1;
            int nFlag = divisor > 0 ? -1 : 1;
            int flag = -1 * mFlag * nFlag;
            //将值转换为负值进行计算
            int m = dividend * mFlag, n = divisor * nFlag;
    
            int r = Search(m, n);
            if (r == Int32.MinValue && flag == -1)
            {
                return Int32.MaxValue;
            }
    
            return r * flag;
        }
    }
    
  • 相关阅读:
    文件的操作
    encode,decode,str,bytes
    字符串操作
    suse12安装mysql8.16
    VMware配置共享磁盘安装RAC
    Linux过滤文本并显示过滤文字的上下文
    Linux服务器卸载mysql指南
    oracle 各版本各日志存放位置
    impdp按用户导入
    数据泵expdp定时备份
  • 原文地址:https://www.cnblogs.com/kanekiken/p/13838923.html
Copyright © 2020-2023  润新知