为了追求严谨,把日期的所有可能性分析得比较仔细,代码写了快200行,当然出现了超时的情况,可以借鉴一下
#include <stdio.h>
#include <math.h>
int a[8],date,i,b,temp,year,p,count;
int main()
{
count=0;
scanf("%d",&date);
temp=date;
while(date<=99999999)
{
p=date;
for(i=0;i<=7;i++)
{
b=pow(10,7-i);
a[i]=p/b;
p=p-a[i]*b;
}
if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]&&(a[4]*10+a[5]<=12))
{
if(a[4]==0&&(a[5]==1||a[5]==3||a[5]==5||a[5]==7||a[5]==8))
{
if(a[6]*10+a[7]<=31&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
if(a[4]==1&&(a[5]==0||a[5]==2))
{
if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
if(a[4]==0&&(a[5]==4||a[5]==6||a[5]==9))
{
if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
if(a[4]==1&&a[5]==1)
{
if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
if(a[4]==0&&a[5]==2)
{
year=a[0]*1000+a[1]*100+a[2]*10+a[3];
if(year%4==0&&year%100!=0)
{
if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
if(year%400==0)
{
if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
else
{
if(a[6]*10+a[7]<=28&&a[6]*10+a[7]>0)
{
printf("%d\n",date);
count++;
break;
}
}
}
}
date++;
}
if(count==0)
{
printf("\n");
}
count=0;
while(temp<=99999999)
{
p=temp;
for(i=0;i<=7;i++)
{
b=pow(10,7-i);
a[i]=p/b;
p=p-a[i]*b;
}
if(a[0]==a[7]&&a[0]==a[2]&&a[0]==a[5]&&a[1]==a[6]&&a[1]==a[4]&&a[1]==a[3]&&(a[4]*10+a[5]<=12))
{
if(a[4]==0&&(a[5]==1||a[5]==3||a[5]==5||a[5]==7||a[5]==8))
{
if(a[6]*10+a[7]<=31&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
if(a[4]==1&&(a[5]==0||a[5]==2))
{
if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
if(a[4]==0&&(a[5]==4||a[5]==6||a[5]==9))
{
if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
if(a[4]==1&&a[5]==1)
{
if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
if(a[4]==0&&a[5]==2)
{
year=a[0]*1000+a[1]*100+a[2]*10+a[3];
if(year%4==0&&year%100!=0)
{
if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
if(year%400==0)
{
if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
else
{
if(a[6]*10+a[7]<=28&&a[6]*10+a[7]>0)
{
printf("%d",temp);
count++;
break;
}
}
}
}
temp++;
}
if(count==0)
{
printf("\n");
}
}
这里需要特别注意一下,日期的范围不应该只给到89991231,否则有一个评测点过不了,日期的范围最好给到99999999