maninbule/LanQiaoCup

1229. 日期问题

Opened this issue · 3 comments

1229. 日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。

小明知道这些日期都在1960年1月1日至2059年12月31日。

令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式

一个日期,格式是”AA/BB/CC”。

即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。

输出格式

输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。

多个日期按从早到晚排列。

数据范围

0≤A,B,C≤9

输入样例:

02/03/04

输出样例:

2002-03-04
2004-02-03
2004-03-02
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int days[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
struct node{
	int year,mou,day;
}ans[4];

bool cmp(node a,node b){
	if(a.year != b.year ) return a.year < b.year ;
	if(a.mou != b.mou ) return a.mou <b.mou ;
	return a.day <b.day ;
}

bool check(int year, int mou ,int day)
{
	if(mou<1||mou>12) return false;
	if(day<1||day>31) return false;
	if((year%4==0&&year%100!=0)||year%400==0) {
		if(mou==2 && day<=29) return true;
	}
	else if(mou==2 && day<=28) return true;
	
	if(day<=days[mou]) return true;
	return false;
}

int main()
{
	int a,b,c;
	scanf("%2d/%2d/%2d",&a,&b,&c);
	int k=0;
	if(a>=60){
		if(check(a+1900,b,c))  ans[k].year = a+1900,ans[k].mou =b,ans[k++].day = c;
	}
	else if(check(a+2000,b,c))  ans[k].year = a+2000,ans[k].mou =b,ans[k++].day = c;
	
	if(c>=60) {
		if( a!=c && check(c+1900,a,b)) ans[k].year = c+1900,ans[k].mou =a,ans[k++].day = b;
		if(a!=b && check(c+1900,b,a)) ans[k].year = c+1900,ans[k].mou =b,ans[k++].day = a;
	}
	else {
		if(a!=c && check(c+2000,a,b)) ans[k].year = c+2000,ans[k].mou =a,ans[k++].day = b;
		if(a!=b && check(c+2000,b,a)) ans[k].year = c+2000,ans[k].mou =b,ans[k++].day = a;
	}
	sort(ans,ans+k,cmp);
	for(int i=0;i<k;i++)
	printf("%d-%02d-%02d\n",ans[i].year ,ans[i].mou ,ans[i].day );
	
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct node{
	int year;
	int month;
	int day;
}num[10];
set<int> s;
bool cmp(node a,node b){
	if(a.year!=b.year){
		return a.year<b.year;
	}
	if(a.month!=b.month){
		return a.month<b.month;
	}
	return a.day<b.day;
}
int main(){
	int a,b,c;
	int index = 0;
	scanf("%d/%d/%d",&a,&b,&c);
	if(a<=59){
		if(c>0&&c<=31&&b>0&&b<=12){
			num[index].year=2000+a;
			num[index].month=b;
			num[index++].day=c;
		}
	}
	else{
		if(c>0&&c<=31&&b>0&&b<=12){
			num[index].year=1900+a;
			num[index].month=b;
			num[index++].day=c;
		}
	}
	if(c<=59){
		if(a>0&&a<=12&&b>0&&b<=31){
			num[index].year=2000+c;
			num[index].month=a;
			num[index++].day=b;
		}
	}
	else{
		if(a>0&&a<=12&&b>0&&b<=31){
			num[index].year=1900+c;
			num[index].month=a;
			num[index++].day=b;
		}
	}
	if(c<=59){
		if(a>0&&a<=31&&b>0&&b<=12){
			num[index].year=2000+c;
			num[index].month=b;
			num[index++].day=a;
		}
	}
	else{
		if(a>0&&a<=31&&b>0&&b<=12){
			num[index].year=1900+c;
			num[index].month=b;
			num[index++].day=a;
		}
	}
	sort(num,num+index,cmp);
	for(int i=0;i<index;i++){
		if(num[i].month==4||num[i].month==6||num[i].month==9||num[i].month==11){
			if(num[i].day<=30){
				if(s.count(num[i].year*10+num[i].month*100+num[i].day)==0){
					s.insert(num[i].year*10+num[i].month*100+num[i].day);
					printf("%d-%02d-%02d\n",num[i].year,num[i].month,num[i].day);
				}
				else{
					continue;
				}
			}
			else{
				continue;
			}
		}
		else if(num[i].month==2){
			int ddd=28;
			if((num[i].year%4==0&&num[i].year%100!=0)||num[i].year%400==0){
				ddd=29;
			}
			if(num[i].day<=ddd){
				if(s.count(num[i].year*10+num[i].month*100+num[i].day)==0){
					s.insert(num[i].year*10+num[i].month*100+num[i].day);
					printf("%d-%02d-%02d\n",num[i].year,num[i].month,num[i].day);
				}
				else{
					continue;
				}
			}
			else{
				continue;
			}
		}
		else{
			if(s.count(num[i].year*10+num[i].month*100+num[i].day)==0){
				s.insert(num[i].year*10+num[i].month*100+num[i].day);
				printf("%d-%02d-%02d\n",num[i].year,num[i].month,num[i].day);
			}
			else{
				continue;
			}
		}
	}
	return 0;
}
hputx commented

#include<bits/stdc++.h>
using namespace std;
int dayy[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int year, int month, int day)
{
if (month == 0 || month > 12) return false;
if (day == 0) return false;
if (month != 2)
{
if (day > dayy[month]) return false;
}
else
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if (day > 28 + leap) return false;
}

return true;

}

int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
for(int i=19600101;i<=20591231;i++)
{
int year=i/10000,month=i%10000/100,day=i%100;
if(check(year,month,day))
{
if(year%100==a && month ==b &&day==c ||
month==a && day==b&& year%100==c ||
day==a && month==b && year%100==c)
printf("%d-%02d-%02d\n",year,month,day);

    }
}
return 0;

}