🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 【程序设计】日期合法性 你已经和小渡一起看清了很多程序语言中的“是非”,这下,你又需要在没有任何小渡的帮助下完成一个任务啦。 这次的题目也不是很难。测试程序将随机给你一个格式为`-`连接了年、月、日的日期字符串(其中的数字都是没有前导零的,也就是说`7`不会被写成`07`)。你将需要判断这个日期在我们的公历体系内是否真实存在。如果存在则输出`YES`,否则输出`NO`。 测试程序给出的测试输入数据中,年、月、日都是正整数(也就是大于零的整数),均不大于 5000。 已知,一年有 1 月~ 12 月,共 12个不同的月份;其中 1月、3 月、5月、7 月、8 月、101月、12 月有 31 个合法的日,分别为 1 日~ 31 日;4 月、6 月、9 月、11 月有 30 个合法的日,分别为 1 日~ 30 日。对于闰年,2 月有 29 个合法的日,分别为 1 日~ 29 日;对于平年(不是闰年的年称为平年),2 月有 28 个合法的日,分别为 1 日~ 28日。 闰年的判断则遵循如下依据: * 非整百年,能被4整除的为闰年。 * 整百年,能被400整除的是闰年。 #### 样例输入 ~~~ 2016-2-29 ~~~ #### 样例输出 ~~~ YES ~~~ ***** 提示: 要想做好这道题,你需要先思考一下,如何使用`cin`去接收一个指定了格式的字符串中的量(在这里就是`-`前后的正整数)。给你一个小贴士——有的时候对于某些变量,我们可以只对其进行接收,而并不需要实际处理它哦! 当然,如果你实在想不出怎么使用`cin`来处理这个输入的话,你也可以放弃`cin`,使用 C 风格的`scanf`函数——这里你可以自行上网搜索,也可以直接参阅这门课程的最后一章《历史的行程——C++ 的过去和未来》中的第一节《C 风格的格式输入输出函数》。相信在做过这个题之后,你会对 C++ 的特点有更进一步的认识。 之后呢,你需要做很多的判断,会用到我们已经学过的 `if... else...` 的嵌套结构。你将需要: * 判断一下输入的年是不是闰年; * 知道年份是不是闰年后,你还需要判断月份数字的合法性,是否月份数字不是一个合法的月份值; * 知道月份后,你还要判断日的合法性(特别要注意,对于 222 月的日子数在闰年和平年的不同)。 如果你怕自己逻辑混乱,画一画具体的逻辑将很有帮助喔! \*\*小贴士:\*\*对于 1 < x < 3 这样的情况判断一定要写成`1 < x && x < 3`喔。 ***** ``` #include<bits/stdc++.h> using namespace std; int main(){ int year,month,day; scanf("%d-%d-%d",&year,&month,&day); if((year%4==0&&year%100!=0)||year%400==0){ if(month==2){ if(day>=1&&day<=29){ cout<<"YES"; }else{ cout<<"NO"; } }else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ if(day>=1&&day<=31){ cout<<"YES"; }else{ cout<<"NO"; } }else if(month==4||month==6||month==9||month==11){ if(day>=1&&day<=30){ cout<<"YES"; }else{ cout<<"NO"; } }else{ cout<<"NO"; } }else{ if(month==2){ if(day>=1&&day<=28){ cout<<"YES"; }else{ cout<<"NO"; } }else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ if(day>=1&&day<=31){ cout<<"YES"; }else{ cout<<"NO"; } }else if(month==4||month==6||month==9||month==11){ if(day>=1&&day<=30){ cout<<"YES"; }else{ cout<<"NO"; } }else{ cout<<"NO"; } } } ``` ``` #include<iostream> using std::cin; using std::cout; using std::endl; int f[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool is_leap(int y){ return y%400==0||(y%4==0&&y%100); } int main(){ int y,m,d; char op; cin>>y>>op>>m>>op>>d; if(m==2){ f[m]+=is_leap(y); } if(m>=1&&m<=12&&d>0&&d<=f[m]){ cout<<"YES"<<endl; } else{ cout<<"NO"<<endl; } return 0; } ```