PTA题目集1-3的总结与归纳
前言:
这是小猿童鞋第一次写博客,主要分析总结一下自己之前写的一些题目,总结经验和教训,分享出来,和大家一同共勉,祝同仁少走弯路,少采坑,写的不好的地方还望不吝赐教。
全文很长,耐心读完也许会有意想不到的收获哦。
目录:(java编写)
1.PTA题目集1__7-7(对多个整数进行排序)
2.PTA题目集1__7-8(判断三角形类型 )
3.PTA题目集2__7-4( 求下一天)
4.PTA题目集2__7-5(求前N天)
5.PTA题目集3__7-2(定义日期类)
6.PTA题目集3__7-3( 一元多项式求导(类设计))
--------------------这是一条华丽分割线---------------------
1.7-7 对多个整数进行排序
题目要求:先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
输入格式:先从键盘输入一个整数n,之后回车 再从键盘输入n个整数,整数之间用一个或多个空格分隔
输出格式:按如下示例输出排序后的数据:The sorted numbers are:排序后的n个数
,每个输出的整数之后有一个空格作为分隔符
输入样例:
输出样例:
分析:
该题主要核心即为数据的存入和排序方法,应该思考用什么存入用户输入的数据,当然我认为数组
就很适合存入,因为输入n值就为数组提供需要存储的空间,排序这里用的冒泡排序供参考
代码展示:
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner input=new Scanner(System.in); int n=input.nextInt(); int[] box=new int[n]; for (int i=0;i<box.length;i++){ int num =input.nextInt(); box[i]=num; } for (int i=0;i<box.length;i++){ for(int j=0;j< box.length-i-1;j++){ if(box[j]>box[j+1]){ int change=box[j+1]; box[j+1]=box[j]; box[j]=change; } } } System.out.print("The sorted numbers are:"); for(int i=0;i< box.length;i++){ System.out.print(box[i]+" "); } } }
这里需要注意的是两个for循环的嵌套来比较数的大小,假设输入n为5,则创建了一个大小为5的数组,利用for循环为数组赋值。5个数一共需要比较4次才能将最大的数沉到最后,然后是4个数比较3次...
用i表示循环的次数,j表示比较的次数,n表示需要比较的数的数量,则可以推出:
注意:数组下标从0开始,i=0表示比较第一次,以此类推。
第一次:N0 N1 ......N(n-1)共n个数,将最大数沉入底,此时i=0,j=n-1;
第二次:N0 N1 ......N(n-2)共n-1个数,将最大数沉入底,此时i=1,j=n-2;
第三次:N0 N1 ......N(n-3)共n-2个数,将最大数沉入底,此时i=2,j=n-3;
...................................................................................................................;
第n-1次:N0 N1共2个数,将最大数沉入底,此时i=n-2,j=1;
第n-2次:N0 共1个数,不动,此时i=n-1,j=0。
循环结束,可以找出规律,i与j的关系,j=n-i-1。
--------------------这是一条华丽分割线---------------------
2.7-8判断三角形类型
题目要求:输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(4)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
分析:
该题需要用户输入三个数作为三角形的三条边,根据边长判断是否能构成三角形,如果可以构成三角形,需要判断三角形的形状并输出。
该题正确的思路即是解题的关键,需要多个if去判断,整体结构并不复杂,我们先来理一下该题的思路。
首先用户输入三个数,需要判断数据的合理性,不合法则输出Wrong Format,合法继续判断;
数据合法后,判断是否能构成三角形,不能构成三角形输出Not a triangle,能构成三角形则继续判断;
将一般三角形General triangle,等腰三角形Isosceles triangle,直角三角形Right-angled triangle并列判断;
如果为等腰三角形Isosceles triangle则需要进一步判断,等边三角形Equilateral triangle为特殊的等腰三角形,等腰直角三角形Isosceles right-angled triangle又比等腰三角形多了一个直角条件。
思路图如下:
代码展示:
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); double a=input.nextDouble(); double b= input.nextDouble(); double c= input.nextDouble(); if((a>=1&&a<=200)&&(b>=1&&b<=200)&&(c<=200&&c>=1)){//数据条件 if(a+b>c&&a+c>b&&b+c>a&&a-b<c&&a-c<b&&b-c<a){//一般三角形条件 if(a==b||b==c||a==c){// if(a==b&&b==c&&a==c){ System.out.println("Equilateral triangle");//等边 } else if((a*a+b*b-c*c<0.00001)||(b*b+c*c-a*a<0.001)||(a*a+c*c-b*b<0.1)){ System.out.println("Isosceles right-angled triangle");//等腰直角 } else System.out.println("Isosceles triangle");//等腰 } else if((a*a+b*b==c*c)||(b*b+c*c==a*a)||(a*a+c*c==b*b)){ System.out.println("Right-angled triangle");//直角 } else System.out.println("General triangle");//一般三角形 } else System.out.println("Not a triangle");//不是三角形 } else System.out.println("Wrong Format");//非法输入 } }
此题的关键在于分析包含与被包含的关系,语法并不复杂,需要掌握if的嵌套使用。
--------------------这是一条华丽分割线---------------------
3.7-4求下一天
题目要求:
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
注意:不允许使用Java中和日期相关的类和方法。
Main类中必须含有如下方法,签名如下:
public static void main(String[] args);//主方法 public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型 public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值 public static void nextDate(int year,int month,int day) ; //求输入日期的下一天s
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
输入样例1:
输出样例1:
输入样例2:
输出样例2:
分析:
此题为时间推算题,看似简单只是将天数加一天罢了,做题前我也是这样想的,可是编译一次又一次的不通过,踩了不少的坑,实则不然,要考虑的因素还是有很多的。
首先我们得考虑输入的数据是否合法,敲重点!!!这里的合法可不仅仅是满足年份在规定范围[1820,2020] ,月份在[1,12],天数在[1,31]就完了,还要分析用户输入的月份是否有31天,
对于2月来说是否有29天,所以并不是如此简单的。
用户输入了年月日,我们需要判断用户输入的年份是否为闰年,闰年2月就有29天,平年28天。
其次判断用户输入的月份,月份分为大小月,众所周知,大月:1,3,5,7,8,10,12;
小月:4,6,9,11;2月的天数与闰年有关,所以我们需要把它拿出来单独讨论。
在2月,闰年的情况下,如果用户输入的为29日,那么下一天就是3月1日,月份加1,天数变为1;
在其他大月里,同理,天数为31,则下一天月数加一,天数变为1,小月也是如此。
在其他天数里,下一天存在在该月份里,就直接加一就行了,有一点要注意的是跨年,当用户输入的为12月31日时,年数也要加1,月数和天数变为1。
部分代码展示:
//判断输入数据是否有效 boolean checkInputValidity(int year,int month,int day){ if((year>=1900&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31)) return true; else return false; }
if (a.checkInputValidity(year,month,day)){ if(!a.isLeapYear(year)&&(a.getMonth()==2&& a.getDay()==29)) System.out.println("Wrong Format");
else {
a.getNextDate();
System.out.println("Next day is:" + a.getYear() + "-" + a.getMonth() + "-" + a.getDay());
}
}
else System.out.println("Wrong Format");
--------------------这是一条华丽分割线---------------------
4.7-5求前N天
题目要求:
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“n days ago is:年-月-日”
输入样例1:
输出样例1:
输入样例2:
输出样例2:
分析:
该题与上一题有着很多的共同之处,数据合理的判断,判断闰年等,找准区别下手,该题也就很简单,基本结构也和上一题区别不大。
7-4与7-5的区别在于这时候需要用户输入n来计算出前几天或者后几天的日期。
踩坑心得:
First:7,8月份为连续的大月,8月份推算前几天的情况下,如果时间推算到了7月,日期需要从31天开始减;
Second:一月份往前推算,记得年要往前减1,此时月份要从12月份开始,天数从31开始减;
Third:往后推算主要注意跨年以及二月份的特殊性。
部分代码展示:
//加减日期 public static void datePlus(int year, int month, int day, int n) { boolean a = ifLeapYear(year); if (n >= -10 && n <= 10) { if (n >= -10 && n <= 0) {//n<0 if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10)) { if (day + Math.abs(n) <= 31) { day = day - n; } else { month += 1; day = day - n - 31; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } if (month == 12) { if (day - n <= 31) { day = day - n; } else { day = day - n - 31; month = 1; year += 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) { if (day - n <= 30) { day = day - n; } else { day = day - n - 30; month += 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } if (a) { if (month == 2) { if (day - n <= 29) { day = day - n; } else { day = day - n - 29; month += 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } } else { if (month == 2) { if (day - n <= 28) { day = day - n; } else { day = day - n - 28; month += 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } } }//n>0 else { if ((month == 12) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10)) { if (day - Math.abs(n) >= 1) { day = day - n; } else { month -= 1; day = day - n + 31; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } if (month == 1) { if (day - n >= 1) { day = day - n; } else { day = day - n + 31; month = 12; year -= 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) { if (day - n >= 1) { day = day - n; } else { day = day - n + 30; month -= 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } if (a) { if (month == 2) { if (day - n >= 1) { day = day - n; } else { day = day - n + 31; month -= 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } } else { if (month == 2) { if (day - n >= 1) { day = day - n; } else { day = day - n + 31; month -= 1; } System.out.println(n + " days ago is:" + year + "-" + month + "-" + day); System.exit(0); } } } } }
注意了哈(手动狗头),其中有瑕疵,需要各位同仁擦亮眼睛,此段经供参考,不足之处还望谅解,有见解的仁兄欢迎评论留言。
--------------------这是一条华丽分割线---------------------
5.7-2定义日期类
题目要求:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
Date类结构如下图所示:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
输出样例1:
输入样例2:
输出样例2:
分析:
该题与7-4求下一天没啥区别,要说有啥区别,我认为是分类明确,增加了Date类,需要类的方法调用,这里就不再过多的去分析题目了,具体分析请参考上面7-4。
直接上代码:
import java.util.*; public class Main { public static void main(String[] args){ Date a=new Date(); Scanner input=new Scanner(System.in); //System.out.println("请输入日期:"); int year= input.nextInt(); a.setYear(year); int month= input.nextInt(); a.setMonth(month); int day= input.nextInt(); a.setDay(day); if (a.checkInputValidity(year,month,day)){ if(!a.isLeapYear(year)&&(a.getMonth()==2&& a.getDay()==29)) System.out.println("Date Format is Wrong"); else { a.getNextDate(); System.out.println("Next day is:" + a.getYear() + "-" + a.getMonth() + "-" + a.getDay()); } } else System.out.println("Date Format is Wrong"); } } class Date { private int year,month,day; int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; Date(){ int year,month,day; int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; } Date(int year,int month,int day){ this.year=year; this.month=month; this.day=day; } void setYear(int year){ this.year=year; } void setMonth(int month){ this.month=month; } void setDay(int day){ this.day=day; } //判断闰年 boolean isLeapYear(int year){ if(year%400==0||(year%4==0&&year%100!=0)) return true; else return false; } //判断输入数据是否有效 boolean checkInputValidity(int year,int month,int day){ if((year>=1900&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31)) return true; else return false; } void getNextDate(){ if (month==1||month==3||month==5||month==7||month==8||month==10) { if (++day <31) this.day = day++; else { this.month = ++month; this.day = 1; } } else if (month==4||month==6||month==9||month==11||month==8) { if (++day < 30) this.day = day++; else { this.month = ++month; this.day = 1; } } else if(month==12){ if(++day<=31) this.day=++day; else{ this.year=++year; this.month=1; this.day=1; } } if(isLeapYear(year)){ if(month==2){ if(++day<=29) this.day=++day; else{ this.month=++month; this.day=1; } } } else if(month==2){ if (++day<=28){ this.day=++day; } else { this.month=++month; this.day=1; } } } int getYear(){ return year; } int getMonth(){ return month; } int getDay(){ return day; } }
--------------------这是一条华丽分割线---------------------
6.7-3 一元多项式求导(类设计)
题目要求:
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。
https://images.ptausercontent.com/a6146210-4a98-4a95-9e7b-a5df3ee89ee4.pdf
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
分析:
该题就是一个数学题了,求导运算法则,利用代码解决求导难题,对于我来说,求导不难,就没有什么必要用java代码来实现这个功能了吧(狗头,俺不会,求大佬棒帮忙)
看到这里的我给您点个赞,全篇太长了,我都看不下去了,更何况宁呢,觉得我还不错的话,给个点赞和关注吧~蟹蟹,笔芯
总结:
java学习刚刚入门,小猿就心有余而力不足了,门还没入呢,就开始脱毛了,正巧省了不少money,hahaha。
路在长,走下去,总能到达,山再高,往上爬,总能登顶。
小猿一直在路上ing...