武汉科技大学城市学院课程设计报告课程设计名称JAVA程序设计课程设计题目 A C M院系信息工程学部专业软件工程班级姓名指导教师2017年6月23日课程设计评分表JA V A编程课程设计指导书学时:1周,学分:11.课程设计目的:JAVA编程课程设计属于软件开发类课程设计。
该课程设计培养学生熟练应用当前主流的JAVA软件开发语言,检验软件的设计、编码与测试,具备较强的JAVA语言软件开发能力。
2.课程设计方式:(1)JAVA编程课程设计方式采取ACM测试的方式,利用所学的面向对象程序设计(JAVA)知识,培养学生具有分析应用问题的能力,能够独立完成应用程序的编制与调试工作。
(3)每个同学必须完成8-12道题,每题写出解题报告,解题报告内容:○1.题目标题○2.题目描述○3.解题思路○4.源码○5.小结3.课程设计平台: eclipse或Myeclipse4.课程设计考核方式(1)学生独立提交软件设计作品和“课程设计报告书”,指导教师根据学生组提交的软件设计作品和“课程设计报告书”的质量,为学生组评定“优”“良”“中”“及格”或“不及格”;(2)根据各组学生所选题目的难易程度以及验收结果,为学生评定“优”“良”“中”“及格”或“不及格”。
“课程设计报告书”包括:课程设计项目名称,课程设计任务, 课程设计任务(功能)说明及功能模块图,数据库设计,各模块功能说明,使用的算法描述(如果需使用算法),各模块界面设计,各模块中关键代码段功能说明与代码行注释,测试说明,参考文献等。
5.参考文献[1] 张思民. Java语言程序设计(第2版)[M].北京:清华大学出版社,2012.1[2] 姜华. Java项目实战教程[M]. 北京:清华大学出版社,2012.9[3] 陈喧. Java程序设计教程[M]. 北京:清华大学出版社,2011.5[4] [美]Echel,B .Java编程思想(第四版)[M].北京:机械工业出版社,2007[5] Michael Main. 数据结构:Java语言描述(第二版)(国外经典计算机科学教材)[M].北京:中国电力出版社,2007目录1 星系炸弹 (1)1.1 问题描述 (1)1.2 解题思路 (1)1.3 代码 (1)1.4 小结 (2)2 小光棍数 (3)2.1 问题描述 (3)2.2解题思路 (3)2.3代码 (3)2.4小结 (4)3 零起点学算法12——求2个日期之间的天数 (5)2.2 问题描述 (5)2.3 解题思路 (5)2.4 代码 (5)2.5 小结 (6)4 零起点学算法34——继续求多项式 (7)4.1 问题描述 (7)4.2 解题思路 (7)4.3 代码 (7)4.4 小结 (8)5 零起点学算法35——再求多项式(含浮点) (9)5.1问题描述 (9)5.2解题思路 (9)5.3代码 (9)5.4小结 (10)6 3n+1问题 (11)6.1问题描述 (11)6.2解题思路 (11)6.3 代码 (11)6.4 小结 (12)7基础练习 Huffuman树 (13)7.1问题描述 (13)7.2解题思路 (13)7.3代码 (14)7.4小结 (14)总结 (15)1星系炸弹1.1问题描述在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,输入定时天数,例如定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为yyyy-mm-dd 即4位年份2位月份2位日期。
比如:2015-02-19输入:输入炸弹引爆延迟的天数。
输出:对于每个输入天数,输出符合题目要求的格式的日期。
样例输入:1000样例输出: 2017-08-051.2解题思路1,分析题意可知,本题是求一个日期,想到了Calendar。
2,输入的数据是这个日期距离2014-11-09的天数,想到了add方法。
3,用set设置起始日期2014-11-09 11月在代码中表现为10。
4,用add方法设置偏移值,偏移值由键盘输入获取scanner。
5,用getTime获取偏移后的Date对象。
6,自定义格式把对象转换成字符串输出,格式为:yy-MM-dd。
1.3代码import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Scanner;public class Main {/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);while(sc.hasNext()){Calendar c=Calendar.getInstance();c.set(2014, 10, 9);int amount=sc.nextInt();c.add(Calendar.DATE,amount);Date date =c.getTime();DateFormat format = newSimpleDateFormat("yyyy-MM-dd");String str=format.format(date);System.out.println(str);}}}1.4小结Calendar对象可以灵活地设置修改日期,非常好用,还有就是要注意在java 中日期的数字表示:月是用0~11的整数表示的,0表示1月,1表示2月......11表示12月。
日是用1~31的整数表示。
小时用0~23的整数表示。
2小光棍数2.1问题描述为了迎接一年一度光棍节的到来,让我们一起来看看小光棍数吧。
倘若一个数的三次方最后三位数是111,这样的数称为小光棍数。
从0开始计数,第一个小光棍数是471(471^3=104487111),请问第m个小光棍数是多少。
输入第一行一个整数T表示有T组测试数据接下来T行每行有一个数m输出输出第m个小光棍数每次输出占一行样例输出11样例输出4712.2解题思路1,分析题意可知,第一次输入的数据表示测试数据有几组,也就是控制循环的次数。
2,第二次输入的数据表示查找第几个小光棍数,想到了定义一个变量作为计数器,查找到一个记一次数,计数器的值等于输入的数据就停止查询,并输出查到的数据。
3,循环控制着一个查找功能,数字的三次方要保证是三位数,不是就不用查找了,用if条件语句控制。
直接把三次方处理后的数据对1000取余数得出的值就是最后三位,如果是111就满足条件,这个数字就是小光棍数。
2.3代码import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();while(n--!=0){long m=scanner.nextLong();System.out.println(471+(m-1)*1000);}}}2.4小结这种特殊数字的查找原本在不用数学方法的情况下,计算量十分大,但是对计算机而言却不是很大,以后这种数据找不到规律可以直接用java写一个程序快速计算。
但要注意对循环的控制。
3 零起点学算法12——求2个日期之间的天数2.2问题描述水题输入输入2个日期,日期按照年月日,年月日之间用符号-隔开(题目包含多组数据)输出求出这2个日期之间的天数(不包括自身),每组测试数据一行样例输入:2011-1-12011-1-5样例输出:32.3解题思路1,分析题意可知,本题使用了日历,想到了Calendar。
2,分别用两个字符串接收输入的数据,并且把接收到的字符串中的年、月、日切割出来,想到了split方法。
3,分别用set设置起始日期和终止日期。
4,分别用getTime方法获取Date对象,再把Date对象转化为毫秒值。
5,用后一个毫秒值减前一个毫秒值,并把毫秒转化成天打印。
2.4代码import java.util.Date;import java.util.Calendar;import java.util.Scanner;public class Main{/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubCalendar c1=Calendar.getInstance();Calendar c2=Calendar.getInstance();Scanner sc=new Scanner(System.in);while(sc.hasNext()){String s1=sc.nextLine();String s2=sc.nextLine();if(s1.equals(s2))return;String[] str1=s1.split("-");String[] str2=s2.split("-");c1.set(Integer.parseInt(str1[0]),Integer.parseInt(str1[1]),Integer.parseInt(str1[2]));c2.set(Integer.parseInt(str2[0]),Integer.parseInt(str2[1]),Integer.parseInt(str2[2]));if(pareTo(c2)>0)return;Date date1=c1.getTime();Date date2=c2.getTime();long time1=date1.getTime();long time2=date2.getTime();long t=time2-time1;int day=(int) (t/1000/3600/24)-1;System.out.println(day);}}}2.5小结对日期进行运算首先要想到,将日期转化为毫秒值,转化后就可以使用数学方法计算,从而得到日期结果,这种想法很方便。