版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l718531794/article/details/85063563
题目地址:https://leetcode-cn.com/problems/divide-two-integers/
思路:这题还是有点意思的,首先是只能用int,然后不能用乘除mod。如果直接傻傻的用减法,那显然超时。考虑用移位来操作,每次将除数逐渐翻倍至最接近被除数,然后将除数减去,直到被除数小于除数。由于负数范围大1,所以全转为负数可以避免一些特定情况的溢出,所以考虑全转负数来做。此段代码为12ms。
AC代码:
class Solution {
public:
int divide(int dividend, int divisor) {
int max = 2147483647;
int min = -2147483648;
if(dividend == min && divisor == -1){
return max;
}
int flag = 1;
if(dividend<0 && divisor>0)
flag = -1;
if(dividend>0 && divisor<0)
flag = -1;
if(dividend>0)
dividend*=-1;
if(divisor>0)
divisor*=-1;
int ans = 0;
while(dividend<=divisor){
int temp = divisor;
int res = 1;
while(divisor >= dividend){
if(divisor >= min>>1){
divisor = divisor<<1;
if(divisor>=dividend)
res = res<<1;
else{
divisor = divisor>>1;
break;
}
}else
break;
}
ans+=res;
dividend-=divisor;
divisor = temp;
}
return ans*flag;
}
};