算法1
(暴力枚举)
分成19XX年和20XX年两种情况讨论
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int months[] = {0,31,30,31,30,31,30,31,31,30,31,30,31};
int is_deep(int y) // 判断闰年
{
if(y%4==0&&y%100|| y%400==0)
return 1;
return 0;
}
int get_days(int y,int m) // 获取当月的天数
{
if(m==2) return 28+is_deep(y);
return months[m];
}
int cal_y(int x) // 求年份
{
return x/10000;
}
int cal_m(int x) // 求月份
{
int t = x%10000;
return t/100;
}
int cal_d(int x) // 求第几天
{
int t = x%100;
return t;
}
bool check(int y,int m,int d) // 判断年-月-日是合法
{
if((m<=0 || m>12 || d<=0 || d>31))
{
return 0;
}
if(d>get_days(y,m)) return 0;
return 1;
}
long long cal_dig(int x,int y,int z)
{
return x*10000+y*100+z;
}
int a,b,c;
long long st[5];
vector<long long> digits;
int main()
{
scanf("%02d/%02d/%02d",&a,&b,&c);
int t;
if(a>=60)
{
a+=1900;
if(check(a,b,c))
{
t = cal_dig(a,b,c);
digits.push_back(t);
}
}
else if(c>=60)
{
c+=1900;
if(check(c,b,a))
{
t = cal_dig(c,b,a);
digits.push_back(t);
}
if(check(c,a,b))
{
t = cal_dig(c,a,b);
digits.push_back(t);
}
}
else
{
a+=2000;
if(check(a,b,c))
{
t = cal_dig(a,b,c);
digits.push_back(t);
}
c+=2000;
a-=2000;
if(check(c,a,b))
{
t = cal_dig(c,a,b);
digits.push_back(t);
}
if(check(c,b,a))
{
t = cal_dig(c,b,a);
digits.push_back(t);
}
}
sort(digits.begin(),digits.end()); // 从小到大排序
auto uni = unique(digits.begin(),digits.end()); // 去重操作1:
digits.erase(uni,digits.end()); // 去重操作2
for(auto it : digits)
{
int y = cal_y(it);
int m = cal_m(it);
int d = cal_d(it);
printf("%d-%02d-%02d\n",y,m,d);
}
return 0;
}