PTA4题学习总结
前言:
这是我20多年以来第一次写博客了,还是在学校里那可(牛)爱(逼)的Java老师的安(逼)慰(迫)下,含泪写下第一篇博客,大家应该都明白这种含泪写下的佳(废)作(品)是多么的动人的。
就不开玩笑了,这里是墨语同学的处女作博客,主要是来分析总结一下本人之前写过的一些题目,总结经验和大多教训,来分享给大家。愿Java萌新们,和我这个小菜鸟一样,一起加油!大家共勉,希望少走弯路吧。PS:别走我的破路,走大神的康庄大道!
目录:(java)
1.PTA题目集2__7-4( 求下一天)
2.PTA题目集2__7-5(求前N天)
3.PTA题目集3__7-2(定义日期类)
4.PTA题目集3__7-3( 一元多项式求导(类设计))
1.求下一天
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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) ; //求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
输入样例1:
在这里给出一组输入。例如:
2020 3 10
输出样例1:
在这里给出相应的输出。例如:
Next date is:2020-3-11
输入样例2:
在这里给出一组输入。例如:
2025 2 10
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
部分代码:
//判断输入数据是否有效
boolean checkInputValidity(int day,int month,int year){
if((year>=1820&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31))
return true;
else
return false;
}
//判断闰年
boolean isLeapYear(int year){
if(year%400==0||(year%4==0&&year%100!=0))
return true;
else
return false;
}
分析:
在看见这个题目的第一眼,我就觉得很简单呀,不就是加一天嘛,so easy呀!可事实却偏偏没那么简单啊,我也踩了好多坑,蓝瘦香菇!
第一坑:在输入数值前,不判断输入的年月日是否符合要求。看题目,年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31]
第二坑:忘记了闰年和平年之分。要判断是否是闰年啊,兄弟们!
第三坑:知道了闰年平年之分,又忘记了2月的29号。
第四坑:不记得大小月,不注意7,8月两个大月连在一起,所以大小月之分是很重要的!一三五七八十腊,三十一天永不差!这还是小学时候学过的口诀,(*^▽^*),
所以编写代码的时候,就要注意了,1,3,5,7,8,10,这几个月要和4,6,9,11这几个月区别开来,别问为什么没有2月和12月,前面一个坑不是刚说了2月最多就29天嘛。而12月
31号过一天就第二年了,也要特别提出来。
于是考虑就如下:
1,3,5,7,8,10这6个月,先判断day>=1&&day<=30,直接在输入的结果上,year和month不变,day+1;如果day=31,则day=1,month+1;
4,6,9,11则4个月,先判断day>=1&&day<=29,直接在输入的结果上,year和month不变,day+1;如果day=30,则day=1,month+1;
2月,就要分清是否是闰年了,是闰年的话,判断day>=1&&day<=28,在输入的数据上,year和month不变,day+1;若day=29,则day=1,month+1;
平年的话,判断day>=1&&day<=27,在输入的数据上,year和month不变,day+1;若day=28,则day=1,month+1;
12月,先判断day>=1&&day<=30,在输入的数据上,year和month不变,day+1,;若day=31,则day=1,month=1,year+1。
上面的就是我踩过的一些坑和我对这个题目的总结。
2.求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:
在这里给出一组输入。例如:
2018 6 19 8
输出样例1:
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
输入样例2:
在这里给出一组输入。例如:
2018 6 19 -8
输出样例2:
在这里给出相应的输出。例如:
-8 days ago is:2018-6-27
if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month== 8) || (month == 10)) { //n<0
if (day + Math.abs(n) <= 31) {
day = day - n;
} else {
month += 1;
day = day - n - 31;
}
if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
if (day - n <= 30) {
day = day - n;
} else {
day = day - n - 30;
month += 1;
}
if ((month == 12) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10)) { //n>0
if (day - Math.abs(n) >= 1) {
day = day - n;
} else {
month -= 1;
day = day - n + 31;
}
if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
if (day - n >= 1) {
day = day - n;
} else {
day = day - n + 30;
month -= 1;
}
分析:
这四段代码呢,是为了告诉大家,分别在n<0和n>0这两种情况下,大月和小月的日期加减的情况,至于2月和12月,第一题的分析就说明了一下注意事项,也
就是2月的28天或29天,12月的跨年问题。大家可以自己分析一下,或者根据我第一题和下面这题的代码来自己总结一下,我就不重复分析了,这3题都是日期的加减问题,
用四个字成语来形容就是大同小异。我的语文还是不错的吧,(#^.^#)
我再补充几点。
第一,1月前10号(n给的范围是[-10,10]),加减要注意year要不要-1这个问题。
第二,每个月的后十号也是要注意month是否+1
3.定义日期类
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
在这里给出一组输入。例如:
1912 12 25
输出样例1:
在这里给出相应的输出。例如:
Next day is:1912-12-26
输入样例2:
在这里给出一组输入。例如:
2001 2 30
输出样例2:
在这里给出相应的输出。例如:
Date Format is Wrong
package date; import java.util.Date;
import java.util.Scanner; public class Main {
int day;
int month;
int year; public Main(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
} public static void main(String[] args) {
class Date {
private int day;
private int month;
private int year; Date() {
this.day = day;
this.month = month;
this.year = year;
} //设置日期
void setDay(int day) {
this.day = day;
} void setMonth(int month) {
this.month = month;
} void setYear(int year) {
this.year = year;
} //判断日期是否正确
boolean checkInputValidity(int day, int month, int year) {
if ((day > 0 && day < 32) && (month > 0 && month < 13) && (year > 1899 && year < 2001))
return true;
else
return false;
} //日期变为第二天
void getNextDate() {
if (month == 1 || month == 3 || month == 5 || month == 8 || month == 10) { //大月
if (++day <= 30)
this.day = day++;
else {
this.month = ++month;
this.day = 1;
}
} else if (month == 2) { //2月
if (day <= 27)
this.day = day++;
else {
this.month = month++;
this.day = 1;
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) { //小月
if (day <= 29) {
this.day = day++;
} else {
this.month = month++;
this.day = 1;
}
} else if (month == 12) { //12月过年
if (day <= 30)
this.day = day++;
else {
this.year = ++year;
this.month = 1;
this.day = 1;
}
}else if (month == 7) { //12月过年
if (++day <= 30)
this.day = ++day;
else {
this.month = ++month;
this.day = 1;
} }
} int getYear() {
return year;
} int getMonth() {
return month;
} int getDay() {
return day;
} } Date a= new Date();
Scanner input = new Scanner(System.in);
int day = input.nextInt();
a.setDay(day);
int month = input.nextInt();
a.setMonth(month);
int year = input.nextInt();
a.setYear(year);
//输出
if (a.checkInputValidity(day, month, year)) {
a.getNextDate();
System.out.println("Next day is:" + a.getYear() + "-" + a.getMonth() + "-" + a.getDay()); } else
System.out.println("Date Format is Wrong"); } }
分析:
(day > 0 && day < 32) && (month > 0 && month < 13) && (year > 1899 && year < 2001),这就是判断年月日的范围了(根据题意来的范围哟)。再输入正确后,当然是在输入的基础上,
这是我当时做题的一次写的源码,你如果认真看了源码的话,肯定会发现一个问题,如果没发现,说明你还有很大的提升空间,不是代码方面的,是常识方面的提升(狗头保命)。
可以很明显的发现,这段代码里面,少了一段代码,那段代码就是判断是否是闰年的代码。没错,在不考虑闰年的情况下,就是上面的代码那样。
首先,定义day(日),month(月),year(年)类,在定义了这些对象后,就要考虑输入的数值是否符合年月日的要求,因此这里直接使用if-else的判断语句进行了,
使日期推后一天喽,再输出第二天的日期,这样一说是不是很简单啊。但真的是这么简单吗?这里就详细的说一下啦。你要完成这个代码,必须先了解日期的变化啦。具体的我就不说了,别问为什么,问就是和第一题一样,
(#^.^#)为什么要多写这个题目呢?是不是多此一举?nonono,PS:老师要求必须写这几个题目的,o(╥﹏╥)o。另外呢,这个题目也比第一题要多一些东西,也就是在第一题的基础上多了一点点。
4.一元多项式求导
题目要求:
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。
https://images.ptausercontent.com/a6146210-4a98-4a95-9e7b-a5df3ee89ee4.pdf
(1)相关概念说明
带符号整数:前导不为 0 的带符号整数,如果是正号,可以省略,例如 -2,、+23、34442409 等。
幂函数:由自变量 x(只支持小写)和指数组成,指数为一个带符号整 数,如 x^-2、x^+25。当指数为 1 时,可以省略指数,如 x。
项:具体包括变量项和常数项。 ➢ 变量项是指带有系数的幂函数,如 2*x^2、-1*x^12; ✓ 系数为 1 时的时候,可以省略系数或表示为正号开头的形式,如 x^-2; ✓ 系数为-1 时的时候,可以表示为符号开头的形式,如-x^3。 ➢ 常数项包含一个带符号整数,例如:233。
表达式:由加法和减法运算符连接若干项组成,如:-1+x^20-x^-6。注 意,表达式中空串不属于合法的表达式,另外,系数与指数均不能为 0。
空白字符:在本次作业中,空白字符仅限于空格。
此外,带符号整数内不允许出现空白字符,其他位置均可以存在空白字 符。
(2)求导算法 求导是数学计算中的一个计算方法,它的定义是:当自变量的增量趋于零时, 因变量的增量与自变量之商的极限。 在本次作业中,我们要对输入的多项式进行求导计算,并输出它的导函数。
本次作业可能用到的导函数公式为: 当 f(x)=a(a 为常数)时,′()=0 当 f(x)=时,′()=b-1 例如: 当 f(x)=26+64+200 时,′()=125+243 输入 2*x^6+6*x^4+200,输出为:12*x^5+24*x^3。
2.2 程序功能需求
(1)实现功能
判定输入表达式是否为正确的表达式;
若输入为正确表达式,则计算其导函数并按要求输出。
(2)输入输出规则
①输入规则
在一行内输入一个待计算导函数的表达式,以回车符结束。
②输出规则
如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。
如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点:
➢ 结果不需要排序,也不需要化简;
➢ 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”;
➢ 当输出结果第一项系数符号为“+”时,不输出“+”;
➢ 当指数符号为“+”时,不输出“+”;
➢ 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
输出样例1:
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
输入样例2:
在这里给出一组输入。例如:
2*x^6-0*x^7+5
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
分析:
这题怎么说呢,我不会呀,毕竟我是初学者,一个小菜鸟,在班上也是属于菜鸟的行列,能够分析出上面3个题目,我也是用光了我的才华,古有巧妇难为无米之炊,今有菜鸡难写导数java。
不知不觉也写了这么多了,求导的数学问题还是很简单的,但是用java来完成,请放过我这只菜鸟吧,求大神有空闲时间能教教我。
结语:
虽然有点讨厌老师要求我们写博客这个作业,但是,讨厌写作业一直都是学生们的共同点(狗头保命)。好啦,不开玩笑了,好好写个结语吧。
很感谢老师布置这个作业,我也能通过这个作业,通过这个blog,在博客园这个平台上能够结交各位大神级人物,也希望我以后能够成为在座的各位大神中个一位,成为一位资深码农。
可以说是刚刚接触java,接触这个专业也没多久,java也是刚刚入门,或者说门还只是跨入了半步,提升的空间还有很多很多,愿能够看到这篇博客的萌新们,大家一起加油!共勉吧!
饭一口一口吃,总有吃饱的时候;路一步一步走,只有无尽的路途!学海无涯,希望能够在java的海洋里面,能够慢慢欣赏java的魅力!
加油加油加油!!!
墨语同学祝大家学业有成,前途似锦!
PTA4题学习总结的更多相关文章
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
- Hitcon 2016 Pwn赛题学习
PS:这是我很久以前写的,大概是去年刚结束Hitcon2016时写的.写完之后就丢在硬盘里没管了,最近翻出来才想起来写过这个,索性发出来 0x0 前言 Hitcon个人感觉是高质量的比赛,相比国内的C ...
- noip2016 小结(ac两题+学习总结)
NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...
- MIPS Pwn赛题学习
MIPS Pwn writeup Mplogin 静态分析 mips pwn入门题. mips pwn查找gadget使用IDA mipsrop这个插件,兼容IDA 6.x和IDA 7.x,在ID ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- CTFHub Web题学习笔记(SQL注入题解writeup)
Web题下的SQL注入 1,整数型注入 使用burpsuite,?id=1%20and%201=1 id=1的数据依旧出现,证明存在整数型注入 常规做法,查看字段数,回显位置 ?id=1%20orde ...
- CTFHub Web题学习笔记(Web前置技能+信息泄露题解writeup)
今天CTFHub正式上线了,https://www.ctfhub.com/#/index,之前有看到这个平台,不过没在上面做题,技能树还是很新颖的,不足的是有的方向的题目还没有题目,CTF比赛时间显示 ...
- PAT算法题学习笔记
1001. 害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去, ...
- TOEIC真题学习
01.The old-fashioned delicatessen inside the street has become a popular place for lunch 街道里面的熟食店正在成 ...
随机推荐
- android之Parcelable
java编程中,为了将对象的状态保存,需要将对象序列化. 在android中,序列化有两种方法可供选择,一个是java自带的序列化方法,只需实现Serializeable接口即可:另一个是androi ...
- 多线程-2.线程创建方式和Thread类
线程的创建方式 1.继承Thread类,重写run方法,示例如下: 1 class PrimeThread extends Thread { 2 long minPrime; 3 PrimeThrea ...
- Catalan数以及相关性质的证明
\(Catalan\) 数相关证明 Mushroom 2021-5-14 \(Catalan\)数的定义 给定一个凸\(n + 1\)边形, 通过在内部不相交的对角线,把它划分成为三角形的组合,不同的 ...
- c语言编程学习之字符串
字符串字面量与字符变量 1.字符串字面量 字符串字面量是一对双引号括起来的字符序列.当c语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间.这块内存空间用来存 ...
- too much recursion
今天在火狐浏览器上调试swagger接口遇到一个浏览器报错: too much recursion 刚开始以为接口出问题了,但是调试之后发现,后台有数据返回,往下一拉,看到了差不多两千多条数据,一下子 ...
- unrar命令解压rar unrar e XXX.rar (验证通过20200511)
unrar命令解压rar 一个从入门到放弃再到改行的工程师 2018-05-02 17:53:04 3916 收藏展开压缩tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成 ...
- 【转载】CentOS 7 系统区域(语言)和键盘设置
CentOS 7 系统区域(语言)和键盘设置 即使是在window中,平常说的语言设置这一项也是归类为系统区域,CentOS可以通过修改/etc/locale.conf配置文件或使用localec ...
- 10.13 nc:多功能网络工具
nc命令 是一个简单.可靠.强大的网络工具,它可以建立TCP连接,发送UDP数据包,监听任意的TCP和UDP端口,进行端口扫描,处理IPv4和IPv6数据包. 如果系统没有nc命令,那么可以手 ...
- Day_04_xml解析
xml解析:操作xml文档,将文档中的数据读取到内存中 操作xml文档的方式有两种: 1.解析(读取):将文档中的数据读取到内存中 2.写入:将内存中的数据保存到xml文档中(后期用的并不多) 解析x ...
- Day30 BigInteger和BigDecimal
BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...