题目描述
注意N的上界89991231也会当做一个输入用例,若循环条件设的不够大会导致该例不能通过
#include <stdio.h>
#include <stdlib.h>
int IsLeapYear(int i);
int NextDay(int i);
int main(int argc, char *argv[])
{
int n;
int flag1,flag2;
int i,j,k;
char str[8];
int find1=0;
scanf("%d",&n);
for(i=n;i<=100000000;i=NextDay(i))
{
flag1=flag2=1;
j=i;//i,j保存年份
for(k=0;k<8;k++)//20200202->20200202
{
str[7-k]=j%10;
j/=10;
}
for(k=0;k<4;k++)//判断回文
{
if(str[k]!=str[7-k])
{
flag1=0;
break;
}
}
if(find1==0 && flag1==1)//未输出过回文,且找到目标回文
{
printf("%d\n",i);
find1++;
}
else if(find1==1)//不再输出回文
find1=-1;
for(k=0;k<4;k+=2)//判断进阶回文
{
int a,b;
a=str[0],b=str[1];
if(str[k]!=a || str[k+1]!=b)
{
flag2=0;
break;
}
}
if(flag1 && flag2)
{
printf("%d",i);
break;
}
}
return 0;
}
int IsLeapYear(int i)//四位年份,是否闰年
{
if((i%4==0 && i%100) || i%400==0)
return 1;//y
return 0;//n
}
int NextDay(int i)//返回下一个有效日期,正序年月日
{
int y=i/10000;//年
int d=i%100;//日
int m=((i-d)/100)%100;//月
int ri;//返回值
d++;
if(IsLeapYear(i/10000))//是闰年
{
if(d==30 && m==2)
{
d=1;
m++;
}
}
else//不是闰年
if(d==29 && m==2)
{
d=1;
m++;
}
if(d==31 &&(m==4 || m==6 || m==9 || m== 11))//其它月份
{
d=1;
m++;
}
else if(d==32 &&(m==1 || m==3 || m==5 || m== 7 || m==8 || m==10))
{
d=1;
m++;
}
else if(d==32 && m==12)
{
d=m=1;
y++;
}
return y*10000+m*100+d;
}