一、题意分析:
二、思路分析:
一个大模拟题, 最重要的是需要注意以下几点:
- 输入的日期是否非法;
- 输出结果时不能重复输出某一个日期;
- 结果输出时需要按照从小到大进行输出.
三、AC Code:
#include <bits/stdc++.h>
using namespace std;
int ans[10];
// 检查日期是否合法
bool check(int year, int month, int day) {
if (day <= 0) return false; // 非法日期
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { // 大月
return day <= 31;
} else if (month == 4 || month == 6 || month == 9 || month == 11) { // 小月
return day <= 30;
} else if (month == 2) { // 2月
if (year % 4 == 0) { // 闰年
return day <= 29;
} else { // 平年
return day <= 28;
}
} else { // 非法月份
return false;
}
}
// 程序主逻辑
int main() {
int year, month, day, length = 0;
int a, b, c;
scanf("%d/%d/%d", &a, &b, &c);
// 1. 年/月/日
year = a; month = b; day = c;
if (year < 60) { // 20xx
year += 2000;
if (check(year, month, day)) ans[++length] = year * 10000 + month * 100 + day;
} else { // 19xx
year += 1900;
if (check(year, month, day)) ans[++length] = year * 10000 + month * 100 + day;
}
// 2. 月/日/年
year = c; month = a; day = b;
if (year < 60) { // 20xx
year += 2000;
if (check(year, month, day)) ans[++length] = year * 10000 + month * 100 + day;
} else { // 19xx
year += 1900;
if (check(year, month, day)) ans[++length] = year * 10000 + month * 100 + day;
}
// 3. 日/月/年
year = c; month = b; day = a;
if (year < 60) { // 20xx
year += 2000;
if (check(year, month, day)) ans[++length] = year * 10000 + month * 100 + day;
} else { // 19xx
year += 1900;
if (check(year, month, day)) ans[++length] = year * 10000 + month * 100 + day;
}
sort(ans + 1, ans + 1 + length);
for (int i = 1; i <= length; i++) {
if (ans[i] == ans[i - 1]) continue;
year = ans[i] / 10000; month = ans[i] % 10000 / 100; day = ans[i] % 100;
printf("%d-%02d-%02d\n", year, month, day);
}
return 0;
}