藍橋杯試題 歷屆試題 日期問題

藍橋杯試題 歷屆試題 日期問題

題目描述:

資源限制
時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章