qingcheng奕  

https://oj.leetcode.com/problems/divide-two-integers/

在不使用乘法、除法、求余的情况下计算除法。

使用减法计算,看看减几次。

刚开始寻思朴素的暴力做,然后超时了。

于是开始增大每次的被减数

但是溢出了。

2的32次方=4294967296(无符号),带符号再除以2,负数比正数多一个,-2147483648~+2147483647

所以int的范围就是 -2147483648~2147483648.

于是当输入中有 -2147483648的时候,对于 abs()函数返回结果就溢出了,求得后的值还是 -2147483648.

于是用 long long 来作为中间数据类型。并且不用abs()函数了。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;  

class Solution {
public:
    int divide(int dividend, int divisor) {

        long long dividend_l = dividend;
        long long divisor_l = divisor;

        bool positive = true;
        if(dividend_l>0&&divisor_l<0 || dividend_l<0 && divisor_l>0)
            positive = false;

        if(dividend_l<0)
            dividend_l = -dividend_l;
        if(divisor_l<0)
            divisor_l = -divisor_l;

        if(dividend ==0 || dividend_l< divisor_l)
            return 0;
        if(dividend == divisor)
            return 1;

        int ans = 0;

        while(dividend_l>=divisor_l)
        {
            ans += subDivide(dividend_l,divisor_l);
        }

        if(positive == false)
            ans = -ans;

        return ans;
    }
    int subDivide(long long &dividend,long long divisor)
    {
        int timesSum = 0;
        long times = 1;
        long long _divisor = divisor;
        while(_divisor>0 && dividend>=_divisor)
        {
            dividend = dividend - _divisor;
            _divisor += _divisor;
            timesSum += times;
            times += times; //means _divisor is how much copies of divisor
        }
        return timesSum;
    }
};

int main()
{ 
    class Solution mys;
    cout<<mys.divide(-1010369383,-2147483648);
}

 

posted on 2014-06-30 20:36  qingcheng奕  阅读(209)  评论(0编辑  收藏  举报