码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_29_Divide Two Integers

时间:2015-02-07 14:31:58      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:c++   leetcode   binary search   vs2012   

版权所有,欢迎转载,转载请注明出处,谢谢技术分享


Divide Two Integers

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

If it is overflow, return MAX_INT.

用减法做:超时。例如:(dividend, divisor) = (2147483647, 1)

方法一:利用二分法。
假设:要求的解在[a, b]中。(而本题中,解存在的范围为[0, dividend])
divisor * (a + b) / 2 > dividend => 解在[a, (a + b) / 2 - 1]中;
divisor * (a + b) / 2 == dividend => 解为(a + b) / 2;
divisor * (a + b) / 2 < dividend => 解在[(a + b) / 2 + 1, b]中或者解就是(a + b) / 2。 
(因为不一定能够刚刚好整除,例如(dividend, divisor) = (5, 2),解为2)

求取(a + b) / 2可以用移位操作;
求取divisor * (a + b)/2 可以用二分加移位。

因此整个复杂度为O(logNlogN)。

P.S. 需要注意符号和数据越界。


//vs2012测试代码
#include<iostream>

using namespace std;

class Solution {
private:
	long long multiplication(long long mid2, long long divisor2) 
	{
		if (mid2 == 0) {
			return 0;
		}
		long long temp = multiplication(mid2 >> 1, divisor2) << 1;
		if ((mid2 & 1) != 0) {
			temp += divisor2;
		}
		return temp;
	}
public:
    int divide(int dividend, int divisor) 
	{
		int flag=1;
		long long ans=0;
        if(divisor == 0)
			return INT_MAX;
		if(dividend == 0)
			return 0;
		if( (dividend<0 && divisor>0) || (dividend>0 && divisor<0) )
		{
			flag=-1;
		}

		long long dividend1 = abs((long long)dividend);
		long long divisor1 = abs((long long)divisor);
		long long left=0, right=dividend1, mid=-1;
		long long temp=0;
		while(left<=right)
		{
			mid = left + ((right-left)>>1);
			temp = multiplication( mid,divisor1);
			if(temp == dividend1)
			{
				ans = mid;
				break;
			}
			else if(temp>dividend1)
				right = mid - 1;
			else if(temp<dividend1)
			{
				ans = mid;
				left = mid + 1;
			}
		}
		ans = flag>0? ans : -ans;
		//着重考虑边界条件,容易忽略
		if( ans > INT_MAX || ans < INT_MIN)
			return INT_MAX;
		return ans;
    }
};


int main()
{
	int dividend,divisor;
	cin>>dividend;
	cin>>divisor;
	Solution lin;
	cout<<lin.divide( dividend,divisor )<<endl;
}

//方法一:自测Accepted
class Solution {
private:
	long long multiplication(long long mid2, long long divisor2) 
	{
		if (mid2 == 0) {
			return 0;
		}
		long long temp = multiplication(mid2 >> 1, divisor2) << 1;
		if ((mid2 & 1) != 0) {
			temp += divisor2;
		}
		return temp;
	}
public:
    int divide(int dividend, int divisor) 
	{
		int flag=1;
		long long ans=0;
        if(divisor == 0)
			return INT_MAX;
		if(dividend == 0)
			return 0;
		if( (dividend<0 && divisor>0) || (dividend>0 && divisor<0) )
		{
			flag=-1;
		}

		long long dividend1 = abs((long long)dividend);
		long long divisor1 = abs((long long)divisor);
		long long left=0, right=dividend1, mid=-1;
		long long temp=0;
		while(left<=right)
		{
			mid = left + ((right-left)>>1);
			temp = multiplication( mid,divisor1);
			if(temp == dividend1)
			{
				ans = mid;
				break;
			}
			else if(temp>dividend1)
				right = mid - 1;
			else if(temp<dividend1)
			{
				ans = mid;
				left = mid + 1;
			}
		}
		ans = flag>0? ans : -ans;
		//着重考虑边界条件,容易忽略
		if( ans > INT_MAX || ans < INT_MIN)
			return INT_MAX;
		return ans;
    }
};

//方法:超时
class Solution {
public:
    int divide(int dividend, int divisor) 
	{
        if(divisor == 0)
			return INT_MAX;
		else if(dividend == 0)
			return 0;
		else if(dividend>0 && divisor>0)
		{
			int count=0;
			while(1)
			{
				if(dividend < divisor)
					return count;
				else
				{
					dividend = dividend - divisor ;
					count++;
				}
			}
		}
		else if(dividend<0 && divisor<0)
		{
			dividend = -dividend;
			divisor = -divisor;
			int count=0;
			while(1)
			{
				if(dividend < divisor)
					return count;
				else
				{
					dividend = dividend - divisor ;
					count++;
				}
			}
		}
		else if(dividend>0 && divisor<0)
		{
			divisor = -divisor;
			int count=0;
			while(1)
			{
				if(dividend < divisor)
					return count;
				else
				{
					dividend = dividend - divisor ;
					count--;
				}
			}
		}
		else if(dividend<0 && divisor>0)
		{
			dividend = -dividend;
			int count=0;
			while(1)
			{
				if(dividend < divisor)
					return count;
				else
				{
					dividend = dividend - divisor ;
					count--;
				}
			}
		}
    }
};


leetcode_29_Divide Two Integers

标签:c++   leetcode   binary search   vs2012   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/43603113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!