【Leetcode长征系列】 Divide Two Integers

来源:互联网 发布:什么是网络空间安全 编辑:程序博客网 时间:2024/04/28 14:58

原题:

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


思路: 记录除数与被除数的符号判断结果的符号。处理除数与被除数的绝对值。我的处理方式是,除数减去被除数!直到减为负数。

代码:

class Solution {public:    int divide(int dividend, int divisor) {        if(divisor==0) return -1;        if(divisor == 1) return dividend;        int res;        bool sig = false;   //false means it is below 0;                 if((dividend <0 && divisor <0) && (dividend>0 && divisor>0)) sig = true;        if(abs(dividend) < abs(divisor)) return 0;        else {            for (int i=abs(dividend), res=0; i>0; i = i-abs(divisor))                res++;        }        if(!sig) res = -res;        return res;    }};

超时,很明显当两者的差别很大时,一点一点减少太浪费时间。

重想。

方法2: 用二分法。先让divisor*2,直到它的值大于dividend,此时用dividend减去这个值,剩下的值继续做之前那种运算,直到剩余值小于divisor。答案便是2的幂值之和。

class Solution {public:    int divide(int dividend, int divisor) {        if(divisor==0) return -1;        if(divisor == 1) return dividend;                int res = 0;        int count;        bool sig = false;   //false means it is below 0;         long int end = abs(dividend);        long int sor = abs(divisor);                if((dividend <0 && divisor <0) && (dividend>0 && divisor>0)) sig = true;        if(abs(dividend) < abs(divisor)) return 0;        else {            while(true){                while(true){                    count++;                    if(pow(count,2)*sor>end) break;                }                res += count-1;                end -= pow(count-1,2)*sor;                count = 0;                if(end < sor) break;            }        }        if(!sig) res = -res;        return res;    }};

依旧超时…

=================================================================================================================================

这里有一个问题!和实验室学长们讨论后重温到一些以前觉得无所谓的知识:

c++中,int的值为[-2^31, 2^31-1], 所以每次当我取abs值时,会造成溢出,从而进入死循环。

所以这道题,我们需要把int改为 long long的64位值。



0 0