Divide Two Integers我的解法

原创 2016年08月31日 15:06:03

刷leetcode时遇到一道比较有意思的题目,虽然题目不难,但是解法却值得人琢磨一下。大神请留名指教,小弟不胜感激!

Divide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT.

题目很清楚:求两个数的商值,但是不能用除法,不能用乘法(很明显)以及模操作。

1.最简单的解法(也是最费时的解法):

不断把被除数减去除数直到结果为负。

int divide(int dividend, int divisor) {
	if (divisor == 0)
		return INT_MAX;
	if (dividend == 0)
		return 0;
	int flag = -1;
	if (dividend*divisor>0)
	{
		flag = 1;
	}
	dividend = abs(dividend);
	divisor = abs(divisor);
	int i = 0;
	while (dividend - divisor >= 0){
		dividend -= divisor;
		++i;
	}
	return i*flag;
}
代码思想很简单,但是却有个致命的问题:时间成本太高。测试用例: 2147483647,1时需要运行2147483647次。

2.另一种解法:问题思考:由于不能使用乘除运算,考虑如何缩减上述过程中的大量运算,假设一个数字在原方案中需要运行的复杂度是O(n),显然n足够大时是不合理的。如果我们在进行减法操作时对除数进行倍增,那么可以得知其运行时间复杂度将会大大缩减。换句话说,第二种方法的思路如下:

不断倍增除数,被除数减除数,记录下需要多少次倍增能使结果为负数。记录下倍增次数(设为co),那么在结果为负数的上一次运算中共有结果2^co次方,将余数进行递归处理,并将结果加到原结果上即可得出最终结果。

int divide(int dividend, int divisor) {
	long long divd = dividend,left=0,divr = divisor,i = 0,co=0;
	if (divr == 0)
		return INT_MAX;
	if (divd == 0)
		return 0;
	int flag = -1;
	if (divd*divr>0)
		flag = 1;
	divd = abs(divd);
	divr = abs(divr);
	long long divr1 = divr;
	if (divr == 1)
	{
		if (divd*flag>INT_MAX)
			return INT_MAX;
		else
			return divd*flag;
	}
	if (divd - divr < 0)
		return 0;
	while (divd - divr >= 0){
		i = pow(2, co++);
		//divd -= divr;
		left = divd - divr;
		divr = divr + divr;
	}
	return flag*(i + divide(left, divr1));
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

(LeetCode) Divide Two Integers (Java)思路讲解及实现

本文将详细介绍Divide Two Integers 的解题思路及Java实现。 题目如下: Divide two integers without using multiplicatio...
  • yuqieshidi
  • yuqieshidi
  • 2015年09月30日 15:52
  • 795

LeetCode --- 29. Divide Two Integers

题目链接:Divide Two Integers Divide two integers without using multiplication, division and mod operato...
  • makuiyu
  • makuiyu
  • 2015年02月02日 21:58
  • 1056

Divide Two Integers -- LeetCode

原题链接: http://oj.leetcode.com/problems/divide-two-integers/  这道题属于数值处理的题目,对于整数处理的问题,在Reverse Integer...
  • linhuanmars
  • linhuanmars
  • 2014年02月27日 05:41
  • 26796

LeetCode 29 Divide Two Integers (C,C++,Java,Python)

Problem: Divide two integers without using multiplication, division and mod operator. If it ...
  • runningtortoises
  • runningtortoises
  • 2015年05月13日 09:27
  • 1815

[LeetCode] 029. Divide Two Integers (Medium) (C++/Python)

[LeetCode] 029. Divide Two Integers (Medium) (C++/Python)
  • hcbbt
  • hcbbt
  • 2015年03月06日 15:29
  • 2599

LeetCode 29 Divide Two Integers 除法的原理

Divide Two Integers Divide two integers without using multiplication, division and mod operat...
  • gx262091291
  • gx262091291
  • 2015年08月22日 22:19
  • 1376

LeetCode(29)Divide Two Integers

题目内容 Divide two integers without using multiplication, division and mod operator. 题目分析 最容易的想到的办法,是把...
  • feliciafay
  • feliciafay
  • 2014年01月03日 07:24
  • 2570

[Leetcode]29. Divide Two Integers @python

题目Divide two integers without using multiplication, division and mod operator.If it is overflow, ret...
  • qian2729
  • qian2729
  • 2016年01月16日 16:48
  • 320

leetcode 29 -- Divide Two Integers

Divide Two Integers 感想: >这道题因为有一点小问题一直导致AC不过,一会我会先贴上自己的正确代码,之前错误的贴到后面。 >在一直解决不了遇到的问题时,我去网上搜了下别人做...
  • wwh578867817
  • wwh578867817
  • 2015年06月12日 17:23
  • 1723

[LeetCode]29.Divide Two Integers

【题目】 Divide two integers without using multiplication, division and mod operator. If it is overfl...
  • SunnyYoona
  • SunnyYoona
  • 2015年01月25日 10:41
  • 1966
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Divide Two Integers我的解法
举报原因:
原因补充:

(最多只允许输入30个字)