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 ÷nd,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); }