leetcode29——两数相乘
作者:互联网
大佬解法:
关于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);
}
}
标签:int,res,divb,long,相乘,leetcode29,Integer,被除数 来源: https://blog.csdn.net/wish9968/article/details/121275619