分析:
方法一:减法
使被除数不断减去除数,直到相减的结果小于除数为止。此时商就为相减的次数,余数为最后相减的差。
实现代码:
package lock;
public class T16 {
public static void divide(int m,int n)
{
/*方法功能,计算两个自然的除法*/
System.out.println(m+"除以"+n);
int res=0;
int remain=m;
//被除数减除数,直到相减结果小于除数为止
while(m>n)
{
m=m-n;
res+=1;
}
remain=m;
System.out.println("商为:"+res+"余数:"+remain);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int m=168;
int n=4;
divide(m,n);
}
}
运行结果:
算法性能分析:
这种方法循环的次数为m/n,因此算法的时间复杂度O(m/n)。需要注意的是,这种方法也实现了不用%操作实现%运算的目的。
方法二:移为法
用等价的加法操作来实现。
实现代码:
package lock;
public class T17 {
public static void divide(int m,int n)
{
System.out.println(m+"除以"+n);
int multi;
int result=0;
while(m>=n)
{
multi=1;
while(multi*n<=(m>>1))
{
multi<<=1;
}
result+=multi;
//相减的结果进入下一次循环
m-=multi*n;
}
System.out.println("商为:"+result+"余数:"+m);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int m=256;
int n=4;
divide(m,n);
}
}
运行结果:
算法性能分析:
由于这种方法采用指数级的增长方式不断逼近m/n,因此算法的时间复杂度为O(log(m/n))。