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

输入格式:

   在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  1. 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
  2. 当输入日期合法,输出下一天,格式如下: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的值,可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“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

输入格式:

  在一行内输入一个待计算导函数的表达式,以回车符结束。

输出格式:

  1. 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
  2. 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
  • 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
  • 当输出结果第一项系数符号为“+”时,不输出“+”;
  • 当指数符号为“+”时,不输出“+”;
  • 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。

输出格式见输入输出示例。

输入样例1:

 

 输出样例1:

 

 输入样例2:

 输出样例2:

 

 分析:

  该题就是一个数学题了,求导运算法则,利用代码解决求导难题,对于我来说,求导不难,就没有什么必要用java代码来实现这个功能了吧(狗头,俺不会,求大佬棒帮忙)

看到这里的我给您点个赞,全篇太长了,我都看不下去了,更何况宁呢,觉得我还不错的话,给个点赞和关注吧~蟹蟹,笔芯

总结:

  java学习刚刚入门,小猿就心有余而力不足了,门还没入呢,就开始脱毛了,正巧省了不少money,hahaha。

路在长,走下去,总能到达,山再高,往上爬,总能登顶。

小猿一直在路上ing...

 

posted @ 2021-04-04 16:18  野猿新之助  阅读(486)  评论(0)    收藏  举报