LeetCode-29. 两数相除

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
};

猜你喜欢

转载自blog.csdn.net/l718531794/article/details/85063563
今日推荐