Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路:
尼玛,各种通不过,开始用纯减法,超时了。
然后用递归,溢出了。
再然后终于开窍了,用循环,把被除数每次加倍去找答案,结果一遇到 -2147483648 就各种不行, 主要是这个数一求绝对值就溢出了。
再然后,受不了了,看答案。 发现,大家都用long long来解决溢出。看得我欲哭无泪啊。
综合后AC的代码:
int divide(int dividend, int divisor) { if(divisor == 1) return dividend; if(dividend == -2147483648 && abs(divisor) == 1) return 2147483647; int sign = (dividend > 0 ^ divisor > 0) ? -1 : 1; long long ans = 0; long long absdivisor = abs((long long)divisor); long long absdividend = abs((long long)dividend); long long t = absdivisor; long long n = 1; while(absdividend >= t + t) //被除数每次加倍,找到可以加到的最大值 { t = t << 1; n = n << 1; } while(absdividend >= absdivisor) //从可以减的最大值开始,每次减,并把除数还原一部分 { if(absdividend >= t) { absdividend -= t; ans += n; } n = n >> 1; t = t >> 1; } return sign * ans; }
时间: 2024-10-17 17:47:24