Divide Two Integers我的解法

来源:互联网 发布:淘宝运营和美工的区别 编辑:程序博客网 时间:2024/05/18 05:49

刷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;elsereturn 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));}



0 0
原创粉丝点击