根据题意 一共就三种情况 年月日 月日年 日月年 但是每个年份又有两种情况 1900 或者2000
所以就是六种情况
每种情况单独判断即可
因为需要日期从小到大输出 所以用year * 10000 + month * 100 + day 作为键值 排序去重即可
(02/02/02)不去重就gg
c++
#include<iostream>
#include<algorithm>
using namespace std;
int ans[10], days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//判断是否满足题意
int isNo(int year, int month, int day) {
if (year < 1960 || year > 2059)return 0;
if (month != 2) {
if (day == 0 || day > days[month])return 0;
} else {
int t = (year % 100 && year % 4 == 0 || year % 400 == 0);
if (day == 0 || day > 28 + t)return 0;
}
return year * 10000 + month * 100 + day;//满足就返回键值
}
int main() {
int a, b, c, count = 0, z;
scanf("%d/%d/%d", &a, &b, &c);
// 年月日
if ((z = isNo(1900 + a, b, c)))ans[count++] = z;
if ((z = isNo(2000 + a, b, c)))ans[count++] = z;
//月日年
if ((z = isNo(1900 + c, a, b)))ans[count++] = z;
if ((z = isNo(2000 + c, a, b)))ans[count++] = z;
//日月年
if ((z = isNo(1900 + c, b, a)))ans[count++] = z;
if ((z = isNo(2000 + c, b, a)))ans[count++] = z;
sort(ans, ans + count);//排序
count= unique(ans,ans+count)-ans;//去重
for (int i = 0; i < count; i++)printf("%d-%02d-%02d\n", ans[i] / 10000, ans[i] / 100 % 100, ans[i] % 100);
return 0;
}