蓝桥杯历届试题——日期问题
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
bool isLeapYear(int year)
{
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return true;
return false;
}
bool isLegal (int yy, int mm, int dd)
{
if(mm > 12 || mm <= 0) return false;
if(dd >31 || dd <= 0) return false;
if(dd <29) return true;
else
{
if(dd == 31 && (mm == 2 || mm == 4 || mm == 6|| mm ==9 || mm == 11)) return false;
if(dd == 30 && mm == 2) return false;
if(dd == 29 && mm == 2)
{
int year = (yy < 60)? 2000 + yy : 1900 + yy;
if(!(isLeapYear(year))) return false;
}
}
return true;
}
struct Date
{
int date[3];
bool operator < (const struct Date dt) const
{
for(int i = 0; i < 3; i++)
{
if(date[i] > dt.date[i]) return false;
else if(date[i] < dt.date[i]) return true;
}
return false;
}
}legalDate[3];
int sum = 0;
void addLegalDate(int y, int m, int d)
{
int year = (y < 60)? 2000 + y : 1900 + y;
for(int i = 0; i < sum; i++)
{
if(legalDate[i].date[0] == year && legalDate[i].date[1] == m && legalDate[i].date[2] == d)
return;
}
legalDate[sum].date[0] = year;
legalDate[sum].date[1] = m;
legalDate[sum].date[2] = d;
sum++;
}
int main()
{
int date[3];
scanf("%d/%d/%d", &date[0], &date[1], &date[2]);
if(isLegal(date[0], date[1], date[2]))
{
addLegalDate(date[0], date[1], date[2]);
}
if(isLegal(date[2], date[0], date[1]))
{
addLegalDate(date[2], date[0], date[1]);
}
if(isLegal(date[2], date[1], date[0]))
{
addLegalDate(date[2], date[1], date[0]);
}
sort(legalDate, legalDate + sum);
for(int i = 0; i < sum; i++)
{
printf("%d-%02d-%02d\n", legalDate[i].date[0], legalDate[i].date[1], legalDate[i].date[2]);
}
return 0;
}