藍橋杯試題 歷屆試題 日期問題
題目描述:
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有采用年/月/日的,有采用月/日/年的,還有采用日/月/年的。更加麻煩的是,年份也都省略了前兩位,使得文獻上的一個日期,存在很多可能的日期與其對應。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
給出一個文獻上的日期,你能幫助小明判斷有哪些可能的日期對其對應嗎?
輸入格式
一個日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
輸出格式
輸出若干個不相同的日期,每個日期一行,格式是"yyyy-MM-dd"。多個日期按從早到晚排列。
樣例輸入
02/03/04
樣例輸出
2002-03-04
2004-02-03
2004-03-02
數據規模和約定
峯值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多餘內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include
不能通過工程設置而省略常用頭文件。
提交程序時,注意選擇所期望的語言類型和編譯器類型。
該題需要注意的是:需要排序,注意不能重複輸出年月日。
AC代碼:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <map>
using namespace std;
int len=0;//結構體中的元素數量
struct time//存儲年月日 的結構體
{
int year;
int month;
int date;
}data[3];
char a[20];
void f(int a,int b,int c)//將年月日存儲到結構體中,目的方便後面排序
{
if(a<=59)
data[len].year=2000+a;
else
data[len].year=1900+a;
data[len].month=b;
data[len].date=c;
len++;
}
bool cmp(time aa,time bb)//結構體排序,按照時間早晚來進行排
{
if(aa.year==bb.year)
{
if(aa.month==bb.month)
return aa.date<bb.date;
else
return aa.month<bb.month;
}
else
return aa.year<bb.year;
}
int isR(int a)//判斷是否是閏年
{
if((a%4==0&&a%100!=0)||a%400==0)
return 1;//是閏年
else
return 0;
}
int isT(int a,int b,int c)//判斷即將輸出的日期,是否合理(比如2020-1-35就不合理)
{
map<int,int> temp;//鍵值對,(第幾月-->該月應該對應的最多天數 )
if(b>12||b<=0||c<=0)
return 0;
if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
temp[b]=31;
else if(b==2)
{
if(isR(a))//是閏年
temp[b]=29;
else
temp[b]=28;
}
else
temp[b]=30;
if(c>temp[b])
return 0;
return 1;
}
int main()
{
int num1,num2,num3,i;
scanf("%d/%d/%d",&num1,&num2,&num3); //注意這種輸入方式,方便很多
if(num1==num2&&num2==num3)//避免重複輸出
{
if(isT(num1,num2,num3))
f(num1,num2,num3);//年/月/日
printf("%d-%02d-%02d\n",data[0].year,data[0].month,data[0].date);
return 0;
}
if(isT(num1,num2,num3))
f(num1,num2,num3);//年/月/日
if(num1==num2)
{
if(isT(num3,num1,num2))
f(num3,num1,num2);//月/日/年
}
else
{
if(isT(num3,num1,num2))
f(num3,num1,num2);//月/日/年
if(isT(num3,num2,num1))
f(num3,num2,num1);//日/月/年
}
sort(data,data+len,cmp);//對存儲好的時間進行排序
for(i=0;i<len;i++)
printf("%d-%02d-%02d\n",data[i].year,data[i].month,data[i].date);
return 0;
}