题目来源:
leetcode题目,网址:29. 两数相除 - 力扣(LeetCode)
解题思路:
直接用加法替代除法会超时,因此先利用左移得到结果的范围,再进行累加。
解题代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend==0){
return 0;
}
int flag=-1; //结果符号
if((dividend>=0 && divisor>=0) ||(dividend<=0 && divisor<=0)){
flag=1;
}
if(divisor==1){
return dividend;
}else if(divisor==-1){
return (dividend==(1<<31))?-((1<<31)+1):-1*dividend;
}
return (int)flag*getQuotient(abs(dividend),abs(divisor));
}
int getQuotient(long dividend, long divisor){
if(divisor>dividend){
return 0;
}else if(divisor==dividend){
return 1;
}
long move=divisor;
long leftMoveTimes=0;
while(move<=dividend){
move=move<<1;
leftMoveTimes++;
}
if(leftMoveTimes!=0)
move=move>>1;
int res=0;
if(leftMoveTimes!=0){
res=1;
for(int i=0;i<leftMoveTimes-1;i++){
res=res<<1;
}
}
while(move<=dividend){
move+=divisor;
res++;
}
return res-1;
}
};
总结:
代码写得很烂。只有 -2^31/-1 这一种情况会溢出。
官方题解是二分查找+快速乘。