思路
除法本质上是在做减法。
例如10除以3=3.....1,可以将这个过程分成被除数每次减去除数:
10-3=7 >3;
7-3=4 >3;
4-3=1 <3;
被除数10减了3次除数3,因此商(result)为3,余数是1。
如果按照这个思路,每次使被除数减去除数,且result++,直到差小于除数。那么这道题的时间复杂度为O(n),会超时。
解决方法
上述思路中,时间复杂度高的主要原因是,每次都只让被除数减去一次除数(t-n,rusult++)。如果打开思路,t/n>=d。则t>=n*d,也就是说,被除数t至少可以减去n次除数d,因次可以直接使t-n*d,result+=n;
顺着这个想法,现在主要问题是确定较大值n,使t/n>=d,result+=n,t-=n*d(得到新差数t,再寻找t对应的较大值n),直到t<d,这样能更快做完减法。如果从n=1逐次尝试,时间复杂度仍然很高。
我们看到t/n,可以想到位运算:整数每右移一位相当于除以2,每左移一位相当于乘以2;假如说t是int类型数据,那么t最多可以右移31位。我们可以用位移来确定较大值n。
for(int i=31;i>=0;i--){
if((t>>i)>=d){ //t除以2^i大于等于d, n=2^i
result+=(1<<i);
t-=(d<<i);
}
}