📄 main.java
字号:
/**
* 求若干个指定数据的最小公倍数
*/
import java.io.*;
public class Main{
public static final int N = 10; //最多可计算数据的个数
public static void main(String args[]) throws Exception{
Main a = new Main();
int n = a.input("请确定数据的个数 (2<=N<="+N+") : ",2,N); //确定数据个数
int[] data = new int[n];
for(int i = 0; i < n; i++){
data[i]=a.input("",0,0); //输入数据
}
int result = a.commonMultiple(data); //计算
a.output(data,result); //输出
}
/**
* 欧几里德辗转相除算法,求a、b两个数的最小公倍数
*/
public int basal(int a,int b){
int i=a,j=b,s;
for(;j!=0&&(s=i%j)!=0;i=j,j=s); //先求a、b的最大公约数j (欧几里德辗转相除算法)
return (j==0?0:(a*b/j)); //得到最小公倍数 (=他们的乘积除以最大公约数)
}
/**
* 分治算法,求整形数组p中所有元素的最小公倍数
*用分治方法解决的问题,大都采用了递归的形式。
*在各种排序方法中,如归并排序、堆排序、快速排序等,都存在有分治的思想。
*/
public int commonMultiple(int p[]){
if (p.length<=2){
return (p.length==1?p[0]:basal(p[0],p[1])); //基础步
}
int[] t1=new int[p.length/2];
int[] t2=new int[p.length-t1.length];
//arraycopy(Object, int, Object, int, int) 类 java.lang.System 中的静态方法从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
System.arraycopy(p,0,t1,0,t1.length); //划分步1、、
System.arraycopy(p,t1.length,t2,0,t2.length); //划分步2
p=null;
int result1 = commonMultiple(t1); //治理步1
int result2 = commonMultiple(t2); //治理步2
return basal(result1,result2); //组合步
}
/**
* 输入方法,s为提示语,若min==max表示对输入的数大小无限制;否则输入的数应满足 min<=n<=max
*/
public int input(String s,int min,int max){
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
int n=0;
for(;;){
System.out.print(s);
try{
n=Integer.parseInt(buf.readLine().trim());
}catch(NumberFormatException e){
System.out.println("输入错误...");
continue;
}catch(IOException e){
System.out.println(e);
System.exit(0);
}
if (min==max||n>=min&&n<=max)break;
System.out.println("输入错误...");
}
return n;
}
/**
* 输出方法
*/
public void output(int[] a,int result){
System.out.print("[");
for (int i = 0; i<a.length; i++){
System.out.print(a[i]+",");
}
System.out.println("\b] 的最小公倍数是 "+result);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -