Problem:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Solution:
不能乘除就加减就行了,但是一个问题是加减有可能速度太慢,因此需要转换,由于任何一个数都能表示成二进制,所以有dividend=divisor*(a*2^1 + b*2^2 + ...... + m*2^k)
所以只要计算出所有divisor*2^k,然后减去即可。
题目大意:
给定两个整数,要求不用乘除法和取模运算,计算出a/b的值,当结果越界的时候输出INT最大值
long long ABS(long long a){
return a>0?a:-a;
}
int divide(int dividend, int divisor) {
int i=0,j,flag=0;
long long sum=0,a,b,map[33],times[33],STOP=1;
STOP=((long long)2147483647)+1;
if(divisor==0)return INT_MAX;
if(dividend==0)return 0;
if((dividend>0 && divisor>0) || (dividend<0 && divisor<0))flag=1;
a=ABS((long long)dividend);
b=ABS((long long)divisor);
map[0]=b;times[0]=1;
while(map[i] <= a && i<33){
i++;
map[i]=map[i-1]+map[i-1];
times[i]=times[i-1]+times[i-1];
}
for(j=i-1;j>=0;j--){
while(a >= map[j]){
a-=map[j];
sum+=times[j];
}
}
sum=flag?sum:-sum;
if(sum<INT_MIN || sum > INT_MAX)return INT_MAX;
return (int)sum;
}
转载请注明原文地址: https://ju.6miu.com/read-676875.html