ブルーブリッジカップ日付号
これは、2017年のブルーブリッジカップC言語地方大会グループBの7番目の質問です。
タイトルの説明
XiaoMingは、一連の歴史的文書を照合しています。これらの歴史的文書には多くの日付が記載されています。
Xiao Mingは、これらの日付が1960年1月1日から2059年12月31日までであることを知っています。
Xiaomingが問題にしているのは、これらの日付の形式が非常に一貫しておらず、使用年/月/日、使用月/日/年、使用日/月/年であるということです。
さらに厄介なのは、年の最初の2桁も省略されているため、文献の日付に対応する可能性のある日付が多数あることです。
たとえば、02/03/04は、2002年3月4日、2004年2月3日、または2004年3月2日です。
文学の日付を考えると、Xiao Mingがそれに対応する可能性のある日付を決定するのを手伝ってもらえますか?
「AA / BB / CC」の形式で日付を入力します。(0 <= A、B、C <= 9)
出力
複数の異なる日付を出力します。日付ごとに1行で、形式は「yyyy-MM-dd」です。
複数の日付が朝から夜まで手配されます。
サンプル入力
02/03/04
サンプル出力
2002年3月4日
2004-02-03
2004-03-02
アイデア:
- この質問を見たばかりですが、とても簡単だと思いました。。。しかし、状況は非常に複雑で、判断すべきことがたくさんあることがわかりました。予想通り、それは後の質問でもあり、単純すぎません。
- 私の考えでは、main関数はデータを受け取り、main関数でデータを並べ替えた後、judge関数を使用して日付が正当かどうかを判断し、正当かどうかを出力します。
- 審査機能は、主に月が妥当かどうか、日が妥当かどうかを月ごとに判断します(最初に30/31日の月かどうか、2月の場合はうるう年かどうかを判断し、次に、日付が制限を超えているかどうかを確認します)。
- その後、同じ日付は1回しか出力されないため、メイン関数では、ジャッジ関数のパラメーターが同じかどうかを判断する必要があります。同じ場合は、同じ日付と1回の出力を意味します。
ACコード:
#include<bits/stdc++.h>
using namespace std;
void judge(int a,int b,int c)//判断是否合理 合理即输出
{
if(b<1||b>12)//月超标 pass
return;
if(c<1||c>31)//日超标 pass
return;
if((b==1||b==3||b==5||b==7||b==8||b==10||b==12)&&c>31)//如果是 1 3 5 7 8 10 12月 并且日期大于31 pass
return;
if((b==4||b==6||b==9||b==11)&&c>30)//如果是 4 6 9 11 月 并且日期大于30 pass
return;
if(b==2)//如果是2月就判断是不是闰年
{
if(a%400==0||(a%4==0&&a%100!=0))//是闰年
{
if(c>29)//大于29天 pass
return;
}
else
{
if(c>28)//大于28天 pass
return;
}
}
printf("%d-%02d-%02d\n",a,b,c);//成功输出
}
int main()
{
int a,b,c,a1,c1;
scanf("%d/%d/%d",&a,&b,&c);
a1=a;
c1=c;
if(a<=59)//加100方便比较
a1+=100;
if(c<=59)
c1+=100;
/*
三种情况
a b c
年 月 日 (1)
月 日 年 (2)
日 月 年 (3)
*/
if(a1<c1)//a小于c的话 先输出(1) 再(2)(3)
{
judge(1900+a1,b,c);//判断是否合理 合理即输出
int max_temp = max(a,b);//取b,c最大值和最小值
int min_temp = min(a,b);
judge(1900+c1,min_temp,max_temp);//按从小到大 输出(2)(3)
if(max_temp!=min_temp)//防止重复输出
judge(1900+c1,max_temp,min_temp);
}
else if(a1==c1)//只有一个年份
{
if(a==b)//三数相等就只输出一次
judge(1900+a1,b,c);
else//否则按顺序输出
{
int max_temp = max(a,b);//取b,c最大值和最小值
int min_temp = min(a,b);
judge(1900+a1,min_temp,max_temp);
judge(1900+c1,max_temp,min_temp);
}
}
else//先输出(2)(3)再(1)
{
int max_temp = max(a,b);//取b,c最大值和最小值
int min_temp = min(a,b);
judge(1900+c1,min_temp,max_temp);//按从小到大 输出(2)(3)
if(max_temp!=min_temp)//防止重复输出
judge(1900+c1,max_temp,min_temp);
judge(1900+a1,b,c);//判断是否合理 合理即输出 (1)
}
return 0;
}