Luogu P8651 题解
这是让我最崩溃的一道橙题了。
整整 11 次提交才 AC。
这道题有几个要点必须注意:
-
判断日期是否合理。
-
按顺序输出。
-
判断重复的日期。
首先,我们来看怎么判断日期是否合理。
我们知道大月有 \(31\) 天,小月有 \(30\) 天,二月看平年闰年。
所以,我们可以写出这样的代码:
bool check(int y,int m,int d){
if(d<=0)return 0;//特判
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){//大月
if(d<=31)return 1;
}
if(m==4||m==6||m==9||m==11){//小月
if(d<=30)return 1;
}
if(m==2){//二月
if(y%4==0){//闰年
if(d<=29)return 1;
}else{//平年
if(d<=28)return 1;
}
}
return 0;
}
接下来,我们需要按顺序输出日期。
我们发现,只有 \(A\) 和 \(C\) 会做年份,此时只要判断 \(A\) 和 \(C\) 哪一年更早即可。
接下来,如果年份相同,那么看月,所以比较 \(A\) 和 \(B\) 哪个更早。
我的输出是放在函数 void out(int n);
里面的,其中 \(n\) 为 \(1,2,3\) 中的一数,表示三种格式。
注意判断年份是 \(19\) 开头还是 \(20\) 开头,并且日期和月份不足两位要输出前导零。
void out(int n){//输出
switch(n){
case 1:{//年月日
if(check(a,b,c)){
printf("%d%02d-%02d-%02d\n",a>=60?19:20,a,b,c);
}
break;// break 很重要
}
case 2:{//月日年
if(check(c,a,b)){
printf("%d%02d-%02d-%02d\n",c>=60?19:20,c,a,b);
}
break;
}
case 3:{//日月年
if(check(c,b,a)){
printf("%d%02d-%02d-%02d\n",c>=60?19:20,c,b,a);
}
break;
}
}
}
signed main(){
scanf("%d/%d/%d",&a,&b,&c);//输入
if(a<60)a+=100;
if(c<60)c+=100;//年份小于 60 要加上 100
if(a<c){//年份比较大小
a%=100;
c%=100;//变回原来的样子
out(1);
if(a<b){
if(c!=a||a!=b||b!=c){//判断重复!!!
out(2);
if(b!=a)out(3);
}
}else{
if(c!=a){
out(3);
if(b!=a)out(2);
}
}
}else{//下面和上面一个道理
a%=100;
c%=100;
if(a<b){
if(c!=a||a!=b||b!=c){
out(2);
if(b!=a)out(3);
}
}else{
if(c!=a){
out(3);
if(b!=a)out(2);
}
}
out(1);
}
return 0;
}
还有一点也很重要,记得判断重复的日期。
比如输入为 01/01/00
时,你的代码很可能输出两个 2000-01-01
,这样会 WA。
判重请看上面的代码理解一下。
AC Code:
#include<iostream>
using namespace std;
int a,b,c;
bool check(int y,int m,int d){
if(d<=0)return 0;//特判
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){//大月
if(d<=31)return 1;
}
if(m==4||m==6||m==9||m==11){//小月
if(d<=30)return 1;
}
if(m==2){//二月
if(y%4==0){//闰年
if(d<=29)return 1;
}else{//平年
if(d<=28)return 1;
}
}
return 0;
}
void out(int n){//输出
switch(n){
case 1:{//年月日
if(check(a,b,c)){
printf("%d%02d-%02d-%02d\n",a>=60?19:20,a,b,c);
}
break;// break 很重要
}
case 2:{//月日年
if(check(c,a,b)){
printf("%d%02d-%02d-%02d\n",c>=60?19:20,c,a,b);
}
break;
}
case 3:{//日月年
if(check(c,b,a)){
printf("%d%02d-%02d-%02d\n",c>=60?19:20,c,b,a);
}
break;
}
}
}
signed main(){
scanf("%d/%d/%d",&a,&b,&c);//输入
if(a<60)a+=100;
if(c<60)c+=100;//年份小于 60 要加上 100
if(a<c){//年份比较大小
a%=100;
c%=100;//变回原来的样子
out(1);
if(a<b){
if(c!=a||a!=b||b!=c){//判断重复!!!
out(2);
if(b!=a)out(3);
}
}else{
if(c!=a){
out(3);
if(b!=a)out(2);
}
}
}else{//下面和上面一个道理
a%=100;
c%=100;
if(a<b){
if(c!=a||a!=b||b!=c){
out(2);
if(b!=a)out(3);
}
}else{
if(c!=a){
out(3);
if(b!=a)out(2);
}
}
out(1);
}
return 0;
}
作者:I_like_magic
出处:https://www.cnblogs.com/I-like-magic/
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。
出处:https://www.cnblogs.com/I-like-magic/
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】