不使用乘法,除法,和取余运算计算两个int型的除法
题目:不使用乘法,除法,和取余运算计算两个int型的除法
思路:既然不让用乘法,除法,只能回归小时候做除法题的解题方法了,理论上可以用cpu的计算除法的方式,来计算,这只是一个思路,我不会,回到最初的方法吧,
如果你是手工做除法的话,那和十进制是一样的办法。
好了,我们现在需要做的事情就是模拟这种情况了
首先,保证全是正数,如果是负数的话,按照正数处理,返回一个负数就行了
处理数据的时候一定要是long,因为防止变态的情况,就是使用int的最大值,和最小值处理,这样就越界了
int divide(int dividend, int divisor) {
long ldividend=dividend;
long ldivisor=divisor;
if (ldividend >= 0 && ldivisor > 0 || ldividend < 0 && ldivisor < 0) {
ldividend = ldividend < 0 ? -ldividend : ldividend; //防止都是负数
ldivisor = ldivisor < 0 ? -ldivisor : ldivisor;
return divide_unsign(ldividend, ldivisor);
}
ldividend = ldividend < 0 ? -ldividend : ldividend;
ldivisor = ldivisor < 0 ? -ldivisor : ldivisor;
int result = divide_unsign(ldividend, ldivisor);
return -result;
}
public int divide_unsign(long dividend, long divisor) {
long result = 1;
long ldividend = dividend;
long ldivisor = divisor;
while (ldivisor < ldividend) {
result <<= 1;
ldivisor <<= 1;
}
if (ldivisor != ldividend) {
result >>= 1;
ldivisor >>= 1;
}
int outcome = 0;
while (ldividend >= divisor) { // 除数和被除数相等的时候,这里需要加入这个=这个条件
if (ldividend >= ldivisor) {
outcome += result;
ldividend -= ldivisor;
}
result >>= 1;
ldivisor >>= 1;
}
return (int) outcome;
}