本帖最后由 朱荣宁. 于 2013-3-12 23:49 编辑
这是一道编程题 :Java求1到20的最小公倍数
这道题本身的算法思想我觉得并不难,我自己试着想了一种方法,算法思想是:
用短除法,就是先把1-20的数一直除以质数2,直到所有的数都不能整除2为止,再除以3……,依此类推,
最后把除数相乘就行
下面是我运行出的代码:
package beishu;
import java.util.ArrayList;
import java.util.Arrays;
public class beishu
{
private static ArrayList tagetIntegers=new ArrayList();//存放除数,它们的积就是所求的值;
private static int[] primes=new int[]{2,3,5,7,11,13,17,19}; //存放的是1-20的质数,可以封装一个方法
private static int[] datas=new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};//存放数据源
private static int flag_1=0;//标记,当值为0的时候表示当前质数数据源中的任何一个数都不能除
private static int j=0;//primes的下标。当他为7的时候,并且没有数可以短除它的时候 结束(也可以断
datas的所有元素都为1的时候结束,麻烦些);
public static void main(String[] args)
{
int flag_time=0;//标记时间复杂度;
while(true){
flag_1=0;
doit();
if(j>=primes.length-1 && flag_1==0){
break;
}
if(flag_1==0)
{
j++;
}
dataPrint();
flag_time++;
}
resultPrint();
System.out.println(“时间复杂度为:”+flag_time*20);
}
//完成一次短除;
public static void doit() {
for(int i=0;i if(datas%primes[j]==0){
datas=datas/primes[j];
flag_1=1;
}
}
if(flag_1==1){
tagetIntegers.add(primes[j]);
}
}
//打印现在的所有数据;
public static void dataPrint(){
System.out.println(“datas数据源:”+Arrays.toString(datas));
System.out.println(“除数:”+tagetIntegers.toString());
System.out.println(“标记:”+flag_1);
System.out.println(“j的值:”+j);
System.out.println();
}
public static void resultPrint(){
int result=1;
for (Integer i : tagetIntegers) {
result*=i;
}
System.out.println(“最后的结果为:”+result);
}
}
不知道细心的高手发现没有,其实这种方法是来回的判断和调用,复杂度很高,我之前在一本书上看到过穷举法和分解质因数发来解决此类的问题,轮过的高手能不能给出可运行的代码,感激不尽! |