首页 > 其他分享 >pta前三次题目集的总结

pta前三次题目集的总结

时间:2023-03-26 15:58:18浏览次数:43  
标签:题目 int System pta month year 三次 input day

(1)前言:前三次题目集的题目数目依次递减,但是难度和涉及的知识点逐渐增大和增加。而每个题目集里的难度又增加,三次题目集主要考察了基本数据类型、三种控制结构、字符串String的用法、StringBuilder的使用和类的构造方法和类方法的调用。

(2)设计与分析:第一次题目集1~4题主要知识点是基本的输入输出、强制转换和三种控制结构,题目比较基础。而第五题就涉及字符和字符串String的用法,同时也涉书本后面的StringBuilder的用法,做这题需要熟悉那些用法。第六题没什么亮点,无非就是对字符串用法的熟悉掌握。而到了第七题就考察了快数排序,用两层循环会超时。第八题难度又开始上升,首先要用一个for循环对其中字符串进行遍历,并边获得每一个位置的字符,再遍历另外一的字符串,用之前获得的字符串与之比较,之后再把不等于另一个字符串的字符放入用StringBuilder创建的对象中。第九题就是对基本语法的考察。第十题虽然文字很多,但只要提取到其中有用的信息,这题也就迎刃而解了,这题考察了字符串的用法,锻炼了我们对题目的分析和逻辑。第十一题就考察了我们的高数,同时需要注意的一个点就是求微积分是求梯形的面积,而不是矩形。第十二题考察基本的语法,一开始我想了很久想先把分母的因子全部求出,然后再用循环遍历1到n-1的数,把这些数用循环和分母的因子相除,但我转念一想,首先我要求出分母的因子,这又得使用循环,而且一个数的因子可能会重复,而且后面判断最简真分数又要使用双层循环,很可能会超时。因此,我就先用一层循环遍历1到n-1,然后再用一层循环遍历2到n-1,让分母和第一层循环的数同时除第二层循环的数...,这种写法简洁明了,但用二层循环没有超时。

               来到第二次题目集,第一题比较基础,唯一需要注意的点就是题目没有给出保留几位小数,需要我们用System.out.print直接输出,但需要对运算结果进行强制转换成float输出,不然答案会错。第二题考察数组,题目比较简单,但是很容易忽略奇数的情况。第三题比较基础,需要注意的点就是题目没有给出保留几位小数,需要我们用System.out.print直接输出,但需要对运算结果进行强制转换成float输出。第四题比较基础,考察了选择结构。第五题稍微有点难度,考察了String的用法,做题时需要用到substring把子字符串提取出来。第六题难度增大,而且定义变量时需要用float定义,用double会出错。接下来就是根据题目写出相关的表达式,而且需要注意循环的条件和表达式的先后。第七题坑有点多,最大的坑就是如何表达''-1'',而且需要注意的是''-1''是个字符串,题目考察字符串的用法和StringBuilder的用法,先要判断字符串是否含有"-1",然后再进行之后的运算。关于我中的一个坑就是在for循环里的循环条件里用s.charAt(i)=='-'&&s.charAt(i+1)=='1'表达"-1",这样显然错误。接下来就是第八题,题目需要注意的一个点就是如何表达直角三角形,很多人肯定认为直角三角形就是两边平方之和等于第三遍,但是由于计算机存储数据有偏差,所以直角三角形的表达式就是两边平方之和减去第三边小于一个很小的数,比如0.01,其他的根据题意写就好了。第九题是本题目集最复杂的题目,主要复杂的地方就是nextDate类方法了,不过我自己最大的问题就是写了垃圾代码,我没注意到月份那些是常量,然后在条件中反复使用那几个月份,没有想到用数组。然后需要注意的是12月31号这一天,加一天就是下一年的年份加一,月份和天数变为一。

             来到第三次题目集,第三次题目集难度较大,也比较花时间,主要是对类的构造方法,方法的调用。第一题就是简单的对类的构造和方法的调用。而从第二题开始难度就提升了一个档次,虽然也是对类的构造和使用,但相比第一题来说更加复杂,做这种题目需要一些耐心,该题目涉及到了LocalDate类,但没有考的很深,只是用LocalDate简单构造一个对象。对于第三题:

我的源码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        int Year=input.nextInt();
        int Month=input.nextInt();
        int Day=input.nextInt();
        Date date=new Date(Year,Month,Day);
        if(date.checkInputValidity()) date.getNextDate();
        else System.out.printf("Date Format is Wrong");
    }
}
class Date{
    private int year=0;
    private int month=0;
    private int day=0;
    public static int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    Date(){
        
    }
    Date(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    int getYear(){
        return year;
    }
    void setYear(int year){
        this.year=year;
    }
    int getMonth(){
        return month;
    }
    void setMonth(int month){
        this.month=month;
    }
    int getDay(){
        return day;
    }
    void setDay(int day){
        this.day=day;
    }
    boolean isLeapYear(int year){
        if((year%4==0&&year%100!=0)||year%400==0) return true;
        else return false;
    }
    boolean checkInputValidity(){
        if((year>=1900&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31))
            return true;
        else return false;
    }
    void getNextDate(){
        if(isLeapYear(year)){
                if(mon_maxnum[month]==31){
                    if(month==12){
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year+1,1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                    else{
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                }
                    if(mon_maxnum[month]==30){
                        if(day>30) System.out.println("Date Format is Wrong");
                        if(day<=30){
                            if(day==30) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                        }
                    }
                            if(mon_maxnum[month]+1==29){
                                if(day>29) System.out.println("Date Format is Wrong");
                                if(day<=29){
                                    if(day==29) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                                }
                            }
        }
        else{
                if(mon_maxnum[month]==31){
                    if(month==12){
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year+1,1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                    else{
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                }
                    if(mon_maxnum[month]==30){
                        if(day>30) System.out.println("Date Format is Wrong");
                        if(day<=30){
                            if(day==30) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                        }
                    }
                            if(mon_maxnum[month]==28){
                                if(day>28) System.out.println("Date Format is Wrong");
                                if(day<=28){
                                    if(day==28) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                                }
                            }
        }
    }
}

我的类图:

 

 

分析解释和心得:

第三题和题目集二的最后一题本质上没有什么差别,只是多了类的使用而已,而且在这一题规定使用数组,也算老师的良苦用心了,避免我们写出垃圾代码。当天数达到一个月最大天数时,月份加一,天数变为一。需要注意的是12月31号这一天,加一天就是下一年的年份加一,月份和天数变为一。

对于第四题:

我的源码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() + 
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}

class DateUtil{
    private int year;
    private int month;
    private int day;
    public static int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    DateUtil(){
        
    }
    DateUtil(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    int getYear(){
        return year;
    }
    void setYear(int year){
        this.year=year;
    }
    int getMonth(){
        return month;
    }
    void setMonth(int month){
        this.month=month;
    }
    int getDay(){
        return day;
    }
    void setDay(int day){
        this.day=day;
    }
    public boolean isLeapYear(int year){
        if((year%4==0&&year%100!=0)||year%400==0) return true;
        else return false;
    }
    public boolean checkInputValidity(){
        if(isLeapYear(year)){
            if(year>=1820&&year<=2020){
            if(month>=1&&month<=12){
                if(mon_maxnum[month]==31){
                    if(day>=1&&day<=31) return true;
                    return false;
                }
                if(mon_maxnum[month]==30){
                    if(day>=1&&day<=30) return true;
                    return false;
                }
                if(mon_maxnum[month]+1==29){
                    if(day>=1&&day<=29) return true;
                    return false;
                }
            }
            return false;
        }
        return false;
        }
        else{
            if(year>=1820&&year<=2020){
            if(month>=1&&month<=12){
                if(mon_maxnum[month]==31){
                    if(day>=1&&day<=31) return true;
                    return false;
                }
                if(mon_maxnum[month]==30){
                    if(day>=1&&day<=30) return true;
                    return false;
                }
                if(mon_maxnum[month]==28){
                    if(day>=1&&day<=28) return true;
                    return false;
                }
            }
            return false;
        }
        return false;
        }
    }
    public DateUtil getNextNDays(int n){
        int i;
        int sum=0;
        int sum1=0;
        int sum2=0;
        int sum3=0;
        int sum4=0;
        DateUtil date1=new DateUtil();
            if(isLeapYear(year)){
                mon_maxnum[2]=29;
                for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum=sum1+day;
            i=0;
            if(sum+n<=366){
                while(sum2+mon_maxnum[i]<sum+n){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum2);
            }
            else{
                while(sum4<sum+n){
                    if(isLeapYear(year)){
                        sum3+=366;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    else{
                         sum3+=365;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    year=year+1;
                }
                i=0;
                sum2=0;
                if(isLeapYear(year)) mon_maxnum[2]=29;
                else mon_maxnum[2]=28;
                while((sum2+mon_maxnum[i])<(sum+n-sum3)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum3-sum2);
            }
            }
        else{
            for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum=sum1+day;
            i=0;
            if(sum+n<=365){
                while(sum2+mon_maxnum[i]<sum+n){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum2);
            }
            else{
                while(sum4<sum+n){
                    if(isLeapYear(year)){
                        sum3+=366;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    else{
                         sum3+=365;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    year=year+1;
                }
                i=0;
                sum2=0;
                if(isLeapYear(year)) mon_maxnum[2]=29;
                else mon_maxnum[2]=28;
                while((sum2+mon_maxnum[i])<(sum+n-sum3)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum3-sum2);
            }
        }
        return date1;
    }
    public DateUtil getPreviousNDays(int n){
        int i;
        int sum=0;
        int sum1=0;
        int sum2=0;
        int sum3=0;
        DateUtil date2=new DateUtil();
            if(isLeapYear(year)) mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
                for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum=sum1+day;
            i=0;
            if(n<sum){
                while((sum2+mon_maxnum[i])<(sum-n)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date2.setYear(year);
                date2.setMonth(i);
                date2.setDay(sum-n-sum2);
            }
            else{
                while(sum3<=(n-sum)){
                    if(isLeapYear(year-1)) sum3+=366;
                    else sum3+=365;
                    year=year-1;
                }
                i=0;
                sum2=0;
                if(isLeapYear(year)) mon_maxnum[2]=29;
                else mon_maxnum[2]=28;
                while((sum2+mon_maxnum[i])<(sum3-n+sum)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date2.setYear(year);
                date2.setMonth(i);
                date2.setDay(sum3-n+sum-sum2);
            }
        return date2;
    }
    public boolean compareDates(DateUtil date){
        if(year<date.getYear()) return true;
        else if(year==date.getYear()){
            if(month<date.getMonth()) return true;
            else if(month==date.getMonth()){
                if(day<date.getDay()) return true;
                return false;
            }
            return false;
        }
        return false;
    }
public boolean equalTwoDates(DateUtil date){
        if(year==date.getYear()&&month==date.getMonth()&&day==date.getDay()) return true;
        else return false;
    }
     public int getDaysofDates(DateUtil date){
         int i,j,k;
         int sum0=0; int sum=0; int sum1=0; int sum2=0; int sum3=0; int sum4=0;
         if(isLeapYear(year)) mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
                for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum0=sum1+day;
         if(isLeapYear(date.getYear())) mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
         for(j=0;j<date.getMonth();j++){
                sum2+=mon_maxnum[j];
            }
            sum=sum2+date.getDay();
        if(equalTwoDates(date)) return 0;
        else{
            if(compareDates(date)){
                if(year==date.getYear()) return(sum-sum0);
                else{
                        for(k=(year+1);k<date.getYear();k++){
                            if(isLeapYear(k)) sum3+=366;
                            else sum3+=365;
                        }
                         if(isLeapYear(year)) return(sum3+366-sum0+sum);
                         else return(sum3+365-sum0+sum);
                    }
            }
            else{
                if(year==date.getYear()) return(sum0-sum);
                else{
                        for(k=(date.getYear()+1);k<year;k++){
                            if(isLeapYear(k)) sum4+=366;
                            else sum4+=365;
                        }
                         if(isLeapYear(date.getYear())) return(sum4+366-sum+sum0);
                         else return(sum4+365-sum+sum0);
                    }
            }
        }
    }
    public String showDate(){
        String s=year+"-"+month+"-"+day;
        return s;
    }
}

我的类图:

 

 

分析解释与心得:

这一题让我感到有一些遗憾,我没能把它做到满分,原因是自己的懒惰和懈怠,虽然试了很多不同写法,但还是无济于事,这题在这四题是最难的,也是最花时间的。主方法已给出,要求我们写一些类方法,个人觉得计算两个日期之差是最简单的。难的是计算下n天的日期和计算前n天的日期。对于计算下n天日期我的想法是先算出一年的总天数,再判断该天数加上下n天是否会小于等于该年的天数,然后再用加上后的天数计算出日期。假如大于的话,那么就减去相应的年数,再计算日期,计算前n天日期也是类似的思路。

踩坑心得:

一开始我是使用这个代码的,这个代码十分复杂,让人做起来效率十分低,而且也比较难看懂,而且最大值测试点我一直过不了。然后我换了一种写法,就是下一天或前一天循环n次。小数据还能测试一下,但是数据十分大时运算就会超时。

改进建议:可以把算法改的更加简单,提高效率。

(3)总结:经过这几次题目集,我学到了基本数据类型、三种控制结构、字符串String的用法、StringBuilder的使用和类的构造方法和类方法的调用。以及锻炼了我的算法能力和逻辑思维,我觉得我要进一步学习后面的内容,和学习老师建议我们学习的内容。我的意见是老师能够给我们具体的方向,感觉很多时候都是盲目学习。

标签:题目,int,System,pta,month,year,三次,input,day
From: https://www.cnblogs.com/nchuht/p/17249860.html

相关文章

  • PTA实验1~3分析及总结
    1.前言    自接触面向对象的程序设计这门课以来,已经完成了三次pta上的实验作业了,在这里对前面的练习做一些分析,同时也总结一些经验。    OK,首先,在难度......
  • Java学习1-前三次题目集的分析与总结
    一. 前言 作为刚学习JAVA的小白,以下只是本人作为普通学生,以当前能力和状态所做出的总结和分析,不足之处也欢迎各位大佬的指正! 第一和第二次题目集的大部分题目难度较......
  • 题目集1~3的总结性Blog
    1.前言:题目集分析:    题目集1题量为十二道题,因为是第一次使用Java编程,所以还不太熟练,题目1是三次题目集中分数最低的。题目集1的知识点偏向于对基本知识的考核,比......
  • OOP PTA题目集1-3总结性Blog
    一、前言总结:第一次题目集:一共12道编程题,题量较多但难度不大,既没有复杂的算法设计,也没有复杂的类设计,有的只是最简单的最基础的语法运用。除了个别题目由于不清楚Java里......
  • OOP题目集1~3总结
    前言:在这三次次题目集里,我们通过共25道题初步了解了Java的一些基本的语法和格式的知识点,有对数据的处理和对字符串的操作,还有类的应用等。可以说是非常简单且基础的三......
  • 题目
    1、语句中的题目   折半查找/二分查找的实现   求最大公约数(辗转相除法)   输入一个数判断是不是素数(①试除法由2--i  ②sqrt(i)利用开平方)    ......
  • 图形推理——线类型题目的思考
    对于图形推理中的线,在做题时常出现思考不出的情形,周末总结下思路,并记录一些特殊的题目。按照暂时的经验和做题频率,我将对其的思考化为四步:1、优先看笔画数,尤其出现特征图......
  • iptables规则持久化
    命令修改iptables后重启会丢失。持久化文件在:/etc/iptables/rules.v4/etc/iptables/rules.v6存储和恢复命令:netfilter-persistentsavenetfilter-persistentstart......
  • 【PTA|Python】浙大版《Python 程序设计》题目集:第五章
    前言Hello!小伙伴!非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿|C++选手|学生简介:因C语言结识编程,随后转入计算......
  • T324159 卡空间的题目/电脑白吃 题解
    https://www.luogu.com.cn/problem/T324159题目大意:给定一个大小为\(n\)的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于\(\lfloor\frac{n}{2}\rfloo......