Divide Two Integers
class Solution {
public:
int divide(int dividend, int divisor) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int res=0;
int sign=0;
size_t i;
size_t len=8*sizeof(int);
long long u1,u2;
//判断除数的特殊情况
if(divisor==0){
return 0;
}
else if(dividend==divisor){
return 1;
}
else{
//先将除数和被除数转换为正数
u1=(long long)dividend<0?-dividend:dividend;
u1=u1==(-2147483647-1)?2147483648:u1;
u2=(long long)divisor<0?-divisor:divisor;
u2=u2==(-2147483647-1)?2147483648:u2;
if(u2>u1){
return 0;
}
//判断除数是否是2的n次幂,是的话就右移。
for(i=0;i<len-1;i++){
//找到除数最左端的1
if(!((1<<i)^u2)){
break;
}
}
if(i!=len-1){
//说明除数是2的i次幂
res=u1>>i;
}
else{
//否则只能用减法
i=0;
while(u1>=u2){
u1=u1-(u2<<i);//每次增加一倍
if(u1<0){
//这时应该减少倍数
u1=u1+(u2<<i);
i--;
continue;
}
res=res+(1<<i);
i++;
}
}
}
sign=((dividend&(1<<(len-1)))^(divisor&(1<<(len-1))));
if(sign){
res=-res;
}
return res;
}
};
class Solution {
public:
int divide(int dividend, int divisor) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int res=0;
int sign=0;
size_t i;
size_t len=8*sizeof(int);
long long u1,u2;
//判断除数的特殊情况
if(divisor==0){
return 0;
}
else if(dividend==divisor){
return 1;
}
else{
//先将除数和被除数转换为正数
u1=(long long)dividend<0?-dividend:dividend;
u1=u1==(-2147483647-1)?2147483648:u1;
u2=(long long)divisor<0?-divisor:divisor;
u2=u2==(-2147483647-1)?2147483648:u2;
if(u2>u1){
return 0;
}
//判断除数是否是2的n次幂,是的话就右移。
for(i=0;i<len-1;i++){
//找到除数最左端的1
if(!((1<<i)^u2)){
break;
}
}
if(i!=len-1){
//说明除数是2的i次幂
res=u1>>i;
}
else{
//否则只能用减法
i=0;
while(u1>=u2){
u1=u1-(u2<<i);//每次增加一倍
if(u1<0){
//这时应该减少倍数
u1=u1+(u2<<i);
i--;
continue;
}
res=res+(1<<i);
i++;
}
}
}
sign=((dividend&(1<<(len-1)))^(divisor&(1<<(len-1))));
if(sign){
res=-res;
}
return res;
}
};