LeetCode 刷题【29. 两数相除】
29. 两数相除
自己做
解1:逐个相减(超时)
class Solution {
public:int divide(int dividend, int divisor) {int res = 0; //除数默认为0,下面的处理都是dividend>0的情况,当dividend为0时,后面会直接返回这个默认值if(divisor == std::numeric_limits<int>::min()) //溢出处理return 0;if(dividend == std::numeric_limits<int>::min() && divisor == -1) //溢出处理return std::numeric_limits<int>::max();if(dividend > 0 && divisor > 0){while(dividend >= divisor){dividend -= divisor;res++;}}else if(dividend > 0 && divisor < 0){while(dividend >= -divisor){dividend += divisor; //相当于dividend -= -divisor,这里就是把负的部分转为正的res--;}}else if(dividend < 0 && divisor < 0){while(dividend <= divisor){dividend -= divisor;res++;}}else if(dividend < 0 && divisor > 0){while(dividend <= -divisor){dividend += divisor;res--;}}return res;}
};
解2:移位运算
忘了
解3:应减尽减
class Solution {
public:int divide(int dividend, int divisor) {int res = 0; //除数默认为0,下面的处理都是dividend>0的情况,当dividend为0时,后面会直接返回这个默认值if (divisor == std::numeric_limits<int>::min() && dividend != std::numeric_limits<int>::min()) //如果dividend不为最小值,那么相除就必为0 return 0;if (dividend == std::numeric_limits<int>::min() && divisor == -1) //溢出处理return std::numeric_limits<int>::max();int len = 0; //这里的len表示2的指数//分同号和异号两种情况if (dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0) { //同号if (dividend > 0 && dividend < divisor ||dividend < 0 && dividend > divisor) //除数比被除数还大,相除为0return 0;//调整divisorwhile (dividend > 0 && divisor <= (dividend >> 1) ||dividend < 0 && divisor >= (dividend >> 1)) { //divisor一开始尽可能取大divisor = divisor << 1; //左移一位相当于*2len++;}//开始相减while (len >= 0) {if (dividend > 0 && dividend >= divisor ||dividend < 0 && dividend <= divisor) { //如果这个对应的divisor*2**len能减(尽可能大),那就减,否则就跳过dividend -= divisor;res += 1 << len;}divisor = divisor >> 1;len--;}}if (dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) { //异号//转为同号处理(这里divisor不为最小值) divisor = -divisor;if (dividend > 0 && dividend < divisor ||dividend < 0 && dividend > divisor) //除数比被除数还大,相除为0return 0;//调整divisorwhile (dividend > 0 && divisor <= (dividend >> 1) ||dividend < 0 && divisor >= (dividend >> 1)) { //divisor一开始尽可能取大divisor = divisor << 1; //左移一位相当于*2len++;}//开始相减while (len >= 0) {if (dividend > 0 && dividend >= divisor ||dividend < 0 && dividend <= divisor) { //如果这个对应的divisor*2**len能减(尽可能大),那就减,否则就跳过dividend -= divisor;res += -1 << len;}divisor = divisor >> 1;len--;}}return res;}
};