一.求N个数的最大公因数和最小公倍数
二.算法设计
- 先输入一组数据
使用listNumber集合实现对数据的存储 - 求出最大公因数
2.1)首先找出所输入数据中的最小值
2.2)然后再将集合中都能被同一个数整除的数记录下来得到list集合
2.3)得到list集合后就能找到其最大值就是最大公因数 - 求出最小公倍数
3.1)将listNumber集合中的每个元素与最大公因数求商,将商存入到list中
3.2)将list中的每个元素相乘,得到的乘积与最大公因数相乘之后得到的就是最小公倍数
三.流程图
四.测试
五.调试
1)在计算最大公因数的地方出现差错
2)在最小公倍数的地方出现差错
六.心得体会
这次的作业虽然在代码难度上不是很有难度,但是在程序的调试和流程图的绘画上也着实费了一番功夫,不过最后自己能够调试程序,也还是颇有收获的,在eclipse中,f5快捷键进入下个程序,f6执行下一行的代码,f8从当前断电执行到下一个断点···的确,在学会使用断点调试程序的确比自己在那瞎看的确快很多。感觉自己在这次代码中,能够有意识去添加注释。这应该也是第一次使用比较规范的画图软件进行流程图的制图,虽然代码写成来,但是要把流程图那么完美的画下来也不是一件比较容易的事。流程图还需要再多多练习。
public static void main(String[] args) {
//从键盘中输入你想输入的数据
Scanner scan = new Scanner(System.in);
//创建一个ArrayList集合,用来接受用户输入的数据。
ArrayList<Integer> listNumber = new ArrayList<>();
System.out.println("请输入您想输入的任意个正整数!");
System.out.println("在输入过程中,请您输入一个数据一个(空格键/Tab键/回车键)再进行下个数据的输入");
System.out.println("如果您想结束数据的输入,请输入-1,再按回车键即可结束");
while(true) {
int num = scan.nextInt();
if(num==-1) {
break;
}
listNumber.add(num);
}
System.out.println("您输入的数据总公有:" + listNumber.size() + "个");
int gcd = calculateGcd(listNumber);//调用最大公因数的方法,可得到最大公因数
int lcm = calculateLcm(listNumber,gcd);//调用最小公倍数的方法,可得到最小公倍数
System.out.println("该组数据的最大公因数是:" + gcd);
System.out.println("该组数据的最小公倍数是:" + lcm);
}
//得到最大公因数的方法
public static int
calculateGcd(ArrayList<Integer> listNumber) {
//用list集合来存储都能被listNumber集合中的数整除的数
ArrayList<Integer> list = new ArrayList<>();
/*
* 找到listNumber集合中最小的数
*/
int min;//定义一个用来存储listNumber集合中最小数的变量
min = listNumber.get(0);//将listNumber集合中的第一个元素赋值给min
for(int i=1;i<listNumber.size();i++) {//循环1——listNumber.size()次
int num = listNumber.get(i);//得到listNumber集合中每个数
if(min>num) {//与min作比较,如果min中的数小于num中的数
min = num;//将num中的数赋值给min
}
}
/*
* 找到所有都能被listArrayList集合中每个整除的数
*/
int i =2;
while(i<=min) {//从2循环到min次
for(int j=0;j<listNumber.size();j++){
int num = listNumber.get(j);//得到listNumber集合中每个数
if((num%i)!=0) {//如果i这个数不能被num整除,则证明i不是num的因数,就排除i,进行下一次的循环
break;
}
if(num==listNumber.get(listNumber.size()-1)) {//判段num与listNumber集合中的最后一个元素是否相等
list.add(i); //进行到这里就可以得到listNumber集合中每个元素都能被i整除,将i加入到list集合中,就可以得到它们的公共因数
}
}
i++;
}
/*
* 找到list集合中最大的元素就是最大公因数
*/
int gcd =list.get(0);//将list集合中的第一个元素赋给gcd
for(int k=1;k<list.size();k++) {
int num = list.get(k);//得到list中的每个数
if(gcd<num) {//与gcd进行比较,如果gcd小于num
gcd=num;//就将num赋值给gcd;
}
}
return gcd ;//返回gcd的值就是该组数中的最大公因数
}
//得到最小公倍数的方法
public static int calculateLcm(ArrayList<Integer> listNumber, int max) {
//用来存储listNumber集合中的每个元素与最大公因素的商
ArrayList<Integer> list = new ArrayList<>();
int clm =1;//定义一个用来存储最小公倍数的变量
for(int i=0;i<listNumber.size();i++) {
int num =listNumber.get(i);//分别得到listNumber集合中的每个元素
list.add(num/max);//将每一个数与最答公因数的商存储在list集合中 }
for(int i=0;i<list.size();i++) {
int num = list.get(i);//分别得到list集合中的每个元素
clm *= num;//将list集合中的所有元素相乘
}
clm = clm * max;//最后将所有的积与最大公因数相乘即可得到最大公倍数
return clm;//返回最大公倍数就为所求的值
}