考验细心程度吧算是
对我来说好致命
解题思路: 枚举日期,判断日期是否合法,排序,去重,输出
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5;
struct node
{
int y,m,d;
}a[maxn];
bool cmp(node a,node b)
{
if(a.y==b.y)
{
if(a.m==b.m)
return a.d<b.d;
return a.m<b.m;
}
return a.y<b.y;
}
int check(int n) //判断是否闰年
{
if((n%100!=0&&n%4==0)||n%400==0)
return 1;
return 0;
}
int f(int y,int m,int d) //判断日期是否合法
{
int k=check(y);
int e[2][12]={
{
31,28,31,30,31,30,31,31,30,31,30,31},{
31,29,31,30,31,30,31,31,30,31,30,31}};
if(y<1960||y>2059)
return 0;
if(m<1||m>12)
return 0;
if(d<1||d>e[k][m-1]) //这里忘记减1
return 0;
return 1;
}
int main()
{
int y,d,m,i,j,n;
int b[3];
int c[3][3]={
{
0,1,2},{
2,0,1},{
2,1,0}};
scanf("%d/%d/%d",&b[0],&b[1],&b[2]);
n=-1;
for(i=0;i<=2;i++)
{
y=b[c[i][0]];
m=b[c[i][1]];
d=b[c[i][2]];
for(j=19;j<=20;j++)
{
if(f(j*100+y,m,d))
{
n++;
a[n].y=j*100+y;
a[n].m=m;
a[n].d=d;
}
}
}
sort(a,a+n+1,cmp);
printf("%d-%02d-%02d\n",a[0].y,a[0].m,a[0].d);
for(i=1;i<=n;i++)
{
//记得去重
if(a[i].y==a[i-1].y&&a[i].m==a[i-1].m&&a[i].d==a[i-1].d)
continue;
printf("%d-%02d-%02d\n",a[i].y,a[i].m,a[i].d);
}
return 0;
}