大佬解法:
力扣
关于int类型和long类型
区别1 16位系统:long是4字节,int是2字节 32位系统:long是4字节,int是4字节 64位系统:long是8字节,int是4字节
区别2 long和int的区别就是他们的占位长度不同 其中long是64位、而int是32位————010101011这样的
区别3 int: 32位整数 -2,147,483,648——2,147,483,647,一般来说整数都够用了————10位 long: 64位整数 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用————19位
关于Integer.MIN_VALUE和Integer.MAX_VALUE
2147483647 -2147483648
本题我只会暴力解法,而且对于越界的还没处理好
首先有四个排除性
当被除数 为0 时,直接返回0
当被除数与除数相等时,返回1
当除数为1,被除数如果超过最大值 则返回最大值 否则返回被除数
当除数为-1时,被除数如果小于最小值 则返回最小值 否则返回被除数*-1
涉及到一个int转long
因为比较好的方法 是通过改变步长来求,何为改变步长
在暴力解法中,我是直接不断使被除数减除数 直到 不能再减为止
这样每次的步长都是固定的,但不妨大胆点 如果被除数很大,除数很小,那么步长也可以大些
所以就有
public int div(long a,long b){ if(a<b) return 0; int count=1; //统计被除次数 long tem=b; while((tem+tem)<=a){ count=count+count; //因为条件是两个tem 所以次数也是两倍 tem=tem+tem; //再后面进入循环中 依旧两倍走下去 }//上述循环可以达到每次都算2倍2倍 以指数级别增长 return count+div(a-tem,b);//这里的话 第一次循环求出最大count,剩下就缩小被除数 看对原始b能除几次 }
那么本题为什么要修改int转long呢?因为有的值可能接近最大值或最小值
如果tem一直增长到十位数时 如:1,147,483,647
那么在循环体中1,147,483,647+1,147,483,647 就超过最大值了 这是tem又变为
然后接着再次循环就会变为0
这样就进入了死循环。
完整代码
class Solution { public int divide(int dividend, int divisor) { //先排除特例值 if(dividend==0) return 0; if(dividend == divisor) return 1; if(divisor == -1){ if(dividend>Integer.MIN_VALUE) return -dividend; return Integer.MAX_VALUE; } if(divisor == 1){ if(dividend<Integer.MAX_VALUE) return dividend; return Integer.MAX_VALUE; } long diva=(long)dividend; long divb=(long)divisor; //判断正负 int sign=1; if( (diva<0 && divb >0) || ( diva>0 && divb <0 ) ){ sign=-1; } //long 类型和int 类型差异需补一下 //判断正负之后统一为正数 diva=diva>0?diva:-diva; divb=divb>0?divb:-divb; //核心部分 int res=div(diva,divb); res=res>Integer.MAX_VALUE?Integer.MAX_VALUE:res; //还原正负 res=(sign>0)?res:-res; return (int)res; } public int div(long a,long b){//这里是int的时候不行 只有long才行 为啥? //if(a==b) return 1; if(a<b) return 0; int count=1; long tem=b; while((tem+tem)<=a){ count=count+count; tem=tem+tem; } return count+div(a-tem,b); } }