数值处理的题目,有两点要考虑的地方:
- 正负号的问题,对于正数除正数, 负数除正数。。。。
- 处理越界的问题。
解决方案:加减法,最简单的方法是用被除数一直减去除数,直到为0, 但是复杂度高。
优化方案: 使用2分法加速这个过程,不断给除数*2,任何一个证书可以表示为以2 的幂为底的一组基的线性组合,num=a1*2^0+a2*2^1....+an*2^n;让除数维左移直到大于被除数之前得到一个最大的基,然后每次减去这个基。 因为是2倍加大,复杂度为logn.
对于 32/3=10
32---3*10=3*(1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0))
先找到a使得 x*2^(a+1),<=y< x*a^(a+1), res+=2^a, y=y-x*2^a
int divide(int dividend, int divisor) { int cnt=divisor; long long dv=abs((long long) dividend); long long ds=abs((long long) divisor); long long remain= dv; long long res=0; while(remain>=ds) { int c=-1; long long v=remain; while(v>=ds) { v>>=1; c++; } remain-=ds<<c; res+=1<<c; } if((divisor>0)!=(dividend>0)) res=-res; return res; }
32/3
首先将3 向左位移,移3位不能继续移 3*8=24 3*16>32, 32-24=8
将3 从头向左移,移1 位不能移 3*2=6 3*4=12>8; 8-6;