29两数相除
题目链接:https://leetcode-cn.com/problems/divide-two-integers/
这题目真的很恶心…让我感觉溢出是c++的核心问题了。这题目标签上给的二分法,就是把商从0到 2 31 − 1 2^{31}-1 231−1用二分法不停的试(先把除数和被除数变成正的,当然这又涉及到溢出了),不过我没这么做。我是用的移位比较,其实就是竖式除法,这溢出处理真的把我恶心到了。
class Solution {
public:
int divide(int dividend, int divisor) {
int result=0;
int tem_dividend=0;
if(dividend==-pow(2,31)){
if(divisor==-1)
return pow(2,31)-1;
else if(divisor==1)
return dividend;
else if(divisor==-pow(2,31))
return 1;
tem_dividend=abs(dividend+1);
}
else
tem_dividend=abs(dividend);
if(divisor==-pow(2,31))
return 0;
int tem_divisor=abs(divisor);
int tem=tem_divisor;
int j=1;
while(tem_dividend>=tem_divisor){
while(tem_dividend>tem&&tem<pow(2,30)){
tem<<=1;
j<<=1;
}
while(tem>tem_dividend){
tem>>=1;
j>>=1;
}
result+=j;
tem_dividend-=tem;
}
if(dividend==-pow(2,31)&&tem_dividend+1==tem_divisor)
result+=1;
if((dividend<0&&divisor>0)||(dividend>0&&divisor<0))
result=-result;
return result;
}
};