第二章作业说明
一、题目名称:
求N个数的最大公约数和最小公倍数。
二、题目要求:
1.程序风格良好,具有自定义的注释模板;
2.提供友好的输入输出,并进行输入数据的正确性验证。
三、算法设计:
1.用户输入一个N值,N值代表需要比较的数据个数;
2.创建一个容器(动态数组)ArrayList存放Integer(int型)数据;
3.从输入扫描N个int型的数值并将N个数据放入ArrayList中;
4.try—catch验证如果输入数据的类型不是整型或者数字的格式有误会报错;
5.调用tgongyue函数,利用辗转相除法和递归法返回N个数的最大公约数;
6.调用tgongbei函数,利用递归返回N个数的最小公倍数;
7.输出各自的结果;
8.程序结束。
四、调试截图
1.调试输入数据部分,确保程序能够接收到收入,System.out.println(e.getMessage()); //返回异常的原因
e.printStackTrace(); //在屏幕输出函数栈信息, 也就是异常出现的地方
这两个函数异常处理函数是在一个名为javaisnext 的博客里看到的,尝试加入到程序中,以下为调试过程:
正确输入:
1-1输入数值N为3
1-2根据系统提示输入N(3)个数据分别为3、12、9顺利得出结果
报错输入:
1-3输入数值N为3
1-4输入数据中有浮点型数据,系统报错
1-5返回异常的原因以及输出异常出现的地方
1-6调试窗口显示输入了一个没有匹配的数值
1-7输入一个超出类型的数据,调试窗口显示
2.调试最大公约数函数模块(gongyue):
2-1输入N值和相应的数据,进入if(x>y)的判断并作出了调整
2-2第一次进入(x!=0)的循环,x,y值得到更新
2-3返回了最终的最大公约数
3.调试最大公约数函数模块(gongbei):
3-1输入数据后先进行了公约数的计算,更新了x,y,a,b的值
3-2更新了g的值
3-3最终得出最小公倍数
五、遇到的困难及解决方案:
- 首先,看到题目后,脑子里知道求两个数的最大公约数和最小公倍数的方法,并尝试写出了代码,然后确保运行结果正确;
然后题目要求是求N个数的最大公约数和最小公倍数,一开始想到的是数组,即定义一个未知长度的数组并接受键盘录入的N个任意数,但是不太会使用,于是去到网上搜索,看到一个帖子“集合框架 ArrayList”,前两天看到有关Java的视频也提到了这个概念,当时对ArrayList的印象是它是一个容器,可以存放不同的东西,无论什么类型均可。 - 这篇帖子详细介绍了ArrayList里常见函数的用法,这是他提到的部分样例:
①获取指定位置的对象
通过.get获取指定位置的对象,如果输入的下标越界,一样会报错
②增加
add有两种用法: 第一种是直接add对象,把对象加在最后面
heros.add(new Hero("hero " + i));
第二种是在指定位置加对象
heros.add(3, specialHero);
而在我自己的程序中,是这样使用的:
成员变量.add
打出“.”之后,是这么描述add函数的:
参数:将参数e附加到列表单,for循环顺序从键盘扫入N个输入的数据
3.关于求N个数的最大公约数和最小公倍数中使用到的递归方法在实际操作中也出现了问题,拿样例12、3、4举例,最后递归调用的结果应是gongyue(4,gongyue(3,12));
于是想到了tgongyue(ArrayListtarget,int z)函数,两个参数第一个是序号为z的target,第二个参数z为这个数据在容器的排序(排序从1开始),系统在调用的时候从序号最大的呢个被录入的数据开始,若递归调用最后一个数据,即排序号为1的数据,则应给gongyue函数返回一个下标为z-1(即0)的数据,最终完成N个数据的调用gongyue和gongbei函数,返回最终的结果。