C++算法:两数相除----使用二分查找的思想

题目:

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:

输入: dividend = 10, divisor = 3 输出: 3

示例 2:

输入: dividend = 7, divisor = -3 输出: -2

说明:

除数不为 0。假设我们的环境只能存储 32 位有符号整数,其数值范围是 [-2^31, 2^31 - 1]。本题中,如果除法结果溢出,则返回 2^31 - 1。

思路:

使用 bool flag = ( (dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))来表示最终的符号;0表示最终符号为负数
关于溢出的问题,可以都先使用long存储结果,再进行判断
采用二分查找的思想,divisor_temp = (dividend_temp + remain_temp)/2;
做法:每次dividend_temp -= divisor_temp;,每次dividend_temp<0时,使dividend_temp += divisor_temp;divisor_temp=divisor再开始运算,每次dividend_temp>0时divisor_temp += divisor_temp;每次dividend_temp=0;break

代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        //思路:使用 bool flag = ( (dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))来表示最终的符号;0表示最终符号为负数
            // 关于溢出的问题,可以都先使用long存储结果,再进行判断
            // 采用二分查找的思想,divisor_temp = (dividend_temp + remain_temp)/2;
                //做法:每次dividend_temp -= divisor_temp;,每次dividend_temp<0时,使dividend_temp += divisor_temp;divisor_temp=divisor再开始运算,每次dividend_temp>0时divisor_temp += divisor_temp;每次dividend_temp=0;break
        
        //一般情况
        bool flag = ( (dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0));
        
        long ret = 0;
        
        long count = 1;
        
        long divisor_temp = abs((long)divisor);
        long dividend_temp = abs((long)dividend);
        
        while(dividend_temp >= abs((long)divisor))
        {
            dividend_temp -= divisor_temp;
            
            if(dividend_temp < 0)
            {
                dividend_temp += divisor_temp;
                
                divisor_temp = abs(divisor);
                
                count = 1;
            }
            
            else if(dividend_temp > 0)
            {
                ret += count;
                
                divisor_temp += divisor_temp;
                
                count += count;
            }
            
            else
            {
                ret += count;
                break;
            }
            
        }
        
        //符号处理 //溢出处理[−2^31,  2^31 − 1]
        if(flag)  // 正数
        {
            if(ret > pow(2,31)-1)
                return pow(2,31)-1;
            return (int)ret;
        }
        else
        {
            if(ret > pow(2,31))
                return pow(2,31)-1;
            return (int)(0-ret);
        }
        
    }
};

你可能感兴趣的:(C++算法)