题目描述
用自带排序效果的set集合记录下可能的日期,保证数据一定是从小到大排列并且不重复
用check函数分别判断按年月日,日月年,月日年组合而成的日期是否合法,如果合法则插入到set集合中
样例
#include <cstdio>
#include <set>
std::set<int> record;
int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int num[3], date;
int check(int year, int month, int day) {
if (month > 12 || day > 31 || month == 0 || day == 0) return false;
if (month != 2 && day > arr[month]) return false;
year += year >= 60 ? 1900 : 2000;
if (month == 2) {
bool leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
if (day > 28 + leap) return false;
}
return year * 10000 + month * 100 + day;
}
int main()
{
scanf("%d/%d/%d", &num[0], &num[1], &num[2]);
if (date = check(num[0], num[1], num[2])) record.emplace(date);//年月日
if (date = check(num[2], num[0], num[1])) record.emplace(date);//月日年
if (date = check(num[2], num[1], num[0])) record.emplace(date);//日月年
for (int ans : record) printf("%d-%02d-%02d\n", ans / 10000, ans % 10000 / 100, ans % 100);
}