• 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;
        }
    }
    
  • 相关阅读:
    计算1的个数
    【环境配置】配置git
    Spoj 9887 Binomial coefficients 构造
    程序猿与HR博弈之:有城府的表达你的兴趣爱好
    C和指针 (pointers on C)——第六章:指针(上)
    关于undo表空间配置错误的ORA-30012
    每天进步一点点——Linux系统中的异常堆栈跟踪简单实现
    javaScript 对象的使用
    手机游戏加密那点事儿_2d资源加密_1
    支持向量机
  • 原文地址:https://www.cnblogs.com/kanekiken/p/13838923.html
Copyright © 2020-2023  润新知