Leetcode——Divide Two Integers

題目ide

    Divide two integers without using multiplication, division and mod operator.
code

    If it is overflow, return MAX_INT.
ip

解體思路it

    首先明確要求:在此題當中,咱們不能使用乘法、除法和取模操做。因此,咱們只可以使用加法、減法和位操做。
io

    先看一個例子。class

    假設咱們要進行15除以3這個操做,那麼15就是被除數,3是除數。除法簡單地來講就是計算除數可以從被除數當中減去多少次(知道被除數不能再減,否則就成了負數)。
di

    首先15 - 3 = 12,12 > 0。而後咱們能夠嘗試減去更多,將3向左移一位,咱們獲得3 << 1 = 6。15 - 6 = 9,9仍然大於0。咱們再次移位,3 << 2 = 12,15 - 12 = 3。而後再次移位,3 << 3 = 24,15 - 24  < 0。這時候咱們知道最多隻能將3向左移位兩次,否則被除數就會爲負。vi

    咱們知道12是由3向左移位兩次獲得,12是3的4倍。4 = 1 << 2。12 = (1 << 2)*3。因而能夠將4加入到結果當中(初始結果爲0)。以上過程相似與15 = 3 * 4 + 3,咱們獲得了係數4和餘數3。while

    而後咱們繼續以上的過程。對餘數3進行上面的操做,咱們獲得了0。最後結果爲result = (1 << 2) + (1 << 0)。co

    注意,有兩種狀況會引發溢出:

    1. divisor = 0

    2. dividend = INT_MAX 而且 divisor = -1,由於abs(INT_MIN) = INT_MAX + 1   

代碼以下:

class Solution {
public:
    int divide(int dividend, int divisor) {
        int result = 0;
		if (divisor == 0)
		{
			return INT_MAX;
		}
		if (dividend == INT_MIN && divisor == -1)
		{
			return INT_MAX;
		}
		if (dividend == 0)
		{
			return 0;
		}

		int sign;
		if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))
		{
			sign = 0;
		}
		else{
			sign = 1;
		}
		long long did = labs(dividend);    //注意這裏應該是labs,不要使用abs
		long long dis = labs(divisor);
		long long temp = dis;
		int count = 0;

		while (temp <= did)
		{
			temp = temp << 1;
			count++;
		}
		count--;
		
		while (did > 0)
		{
			if (did < dis)	//被除數已經除盡,餘數爲0或者小於除數
			{
				break;
			}
			if (did - (dis << count) < 0 && count > 0)
			{
				count--;
				continue;
			}
			did = did - (dis << count);
			result = result + (1 << count);
			count--;
		}

		if (sign)
		{
			return -result;
		}
		else{
			return result;
		}
    }
};
相關文章
相關標籤/搜索