不使用乘法,除法,和取余运算计算两个int型的除法

题目:不使用乘法,除法,和取余运算计算两个int型的除法

思路:既然不让用乘法,除法,只能回归小时候做除法题的解题方法了,理论上可以用cpu的计算除法的方式,来计算,这只是一个思路,我不会,回到最初的方法吧,

 

 如果你是手工做除法的话,那和十进制是一样的办法。


不使用乘法,除法,和取余运算计算两个int型的除法
 

好了,我们现在需要做的事情就是模拟这种情况了

 

首先,保证全是正数,如果是负数的话,按照正数处理,返回一个负数就行了

处理数据的时候一定要是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;
	}