(一、暴力法)
暴力法虽然能通过所有案例但是会超时。
代码如下:
class Solution {
public int divide(int dividend, int divisor) {
int result=1;
int flag=0;
if(dividend==-2147483648 && divisor==-1){
return 2147483647;
}
if(dividend==divisor){
return 1;
}
if(dividend>0 && divisor>0){
if(dividend<divisor){
return 0;
}
result=dividend-divisor;
flag++;
while(result>=divisor){
result=result-divisor;
flag++;
}
}
if(dividend<0 && divisor<0){
if(dividend>divisor){
return 0;
}
result=dividend-divisor;
flag++;
while(result<=divisor){
result=result-divisor;
flag++;
}
}
if(dividend>0 && divisor<0){
if(dividend<(-divisor) || divisor==-2147483648){
return 0;
}
result=dividend+divisor;
flag++;
while(result>=(-divisor)){
result=result+divisor;
flag++;
}
return -flag;
}
if(dividend<0 && divisor>0){
if((-dividend)<divisor && dividend!=-2147483648){
return 0;
}
result=dividend+divisor;
flag++;
while (result<=(-divisor)){
result=result+divisor;
flag++;
}
return -flag;
}
return flag;
}
}
(二、递归)
我们利用递归函数可以大大缩减求得最终值的速度。
代码:
class Solution {
public int divide(int dividend, int divisor) {
if(dividend==0) return 0;//被除数为0,返回值为0
if(divisor==-1){//除数为-1时
if(dividend==-2147483648)
return 2147483647;//结果超过数值范围返回最大数
else
return -dividend;//返回dividend的相反数
}
if(divisor==1) return dividend;//除数为1返回被除数dividend本身
int flag=1;//标记值,标记值为1时结果为正数,不为1为负数
if((dividend>0 && divisor<0) || (dividend<0 && divisor>0))//判断结果是否为负数
flag=-flag;//如果结果为负数则更新flag值
long a=dividend;//利用long将dividend的值赋值给a
long b=divisor;//利用long将divisor的值赋值给b
if(dividend<0){
a=-a;//将dividend转为正数
}
if(divisor<0){
b=-b;//将divisor转为正数
}
//利用long是为了不用考虑将dividend和divisor转换为正数时越界问题
long result=div(a,b);//调用div方法得到最终结果
if(flag==1){//判断结果是正数还是负数,正数返回result,负数返回-result
return result>2147483647?214748364: (int) result;//判断结果是否越界,越界返回最大值2147483647,没有则返回result
}
else {
return (int) -result;
}
}
public long div(long a,long b){
if(b>a){//如果除数大于被除数返回0
return 0;
}
long result=1;//定义result初始值为1
long b1=b;//将b1赋值为b,且为了保证除数b保留原始值,并且不用考虑b越界,因为测试时b1可能会越界
while((b1+b1)<=a){//保证测试值的两倍不能 大于a值
result=result+result;//结果翻倍
b1=b1+b1;//测试值翻倍
}
return result+div(a-b1,b);//递归求解,直到除数b大于被除数a(更新后的a)
}
}