最近在复习数据结构与算法相关的知识点,做了些些训练题,今天碰到了以前做过的因式分解的问题,以前用C写的,现在没什么印象了。今天重新用递归的方法完成了编写,对应做了些优化,希望对学习数据结构与算法的同学有帮助了,这次使用java实现的,不多说,上代码了。
public static void devide(int num){
StringBuffer buffer = new StringBuffer() ;
buffer.append(num+"=") ;
devide(buffer,num,2) ;
System.out.println(buffer.toString()) ;
}
private static void devide(StringBuffer buffer,int num,int start){
boolean flag = false ;
int temp = num ;
for(int i=start;i<=Math.sqrt(num);i++){
if(num%i==0){
buffer.append(i+"*") ;
temp=num/i ;
start=i ;
flag = true ;
break ;
}
}
if(flag){
devide(buffer,temp,start) ;//重新分解因式的的时候,开始的那个除数不应该是从2开始,而应该是上一次做整时的那个除数
}else{
buffer.append(temp) ;
}
}
这里面编写了两个函数,真正实现因式分解的那个函数,权限被设置为了private,调用的那个函数为public,这样做的目的是隐藏因式分解算法的具体实现过程,在函数里面设置变量buffer,然后作为函数的形参,保存函数执行过程中所产生的因数。
相对于以前的方法,devide(StringBuffer buffer,int num,int start)里面设置了start参数,这个参数是在因式分解开始的时候作为除数的值,有的实现方法里面直接将其设置为2,每次做判断的时候都是从2开始,显然这是没有必要的。例如:420=2*2*3*5*7,420/2/2/3=35,35再,35分解的时候里面不可能含有2的因式了吧,最少应该是从3开始的,就在这个地方稍微做了下改进。有不足的地方,请大家多多指正了。
devide(120)=2*2*2*3*5 ;