题目
2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。
也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。
代码
#include <stdio.h>
#include <stdlib.h>
int Compare(int year,int month,int day);
int main(int argc, char *argv[])
{
int date,year,month,day,p,a,flag1=0,flag2=0;
scanf("%d",&date);
year = date/10000;
month = (date%10000)/100;
day = date%100+1;
for(;year<9999;year++)
{
for(;month<=12;month++)
{
if(month==4||month==6||month==9||month==11)
p=30;
else if((month==2)&&(((year%4==0)&&(year%100!=0))||(year%400==0)))
p=29;
else if(month==2)
p=28;
else
p=31;
for(;day<=p;day++){
a = Compare(year,month,day);
if((a == 1)&&(flag1==0))
{
printf("%d\n",year*10000+month*100+day);
flag1=1;
}
if((a == 2)&&(flag2==0))
{
printf("%d\n",year*10000+month*100+day);
flag2=1;
}
if((flag1==1)&&(flag2==1))
goto END;
}
day=1;
}
month=1;
}
END: ;
return 0;
}
int Compare(int year,int month,int day)
{
int a[4],b[2],c[2];
a[0] = year/1000;
a[1] = (year%1000)/100;
a[2] = (year%100)/10;
a[3] = year%10;
b[0] = month/10;
b[1] = month%10;
c[0] = day/10;
c[1] = day%10;
if((a[1]==a[3])&&(a[3]==b[0])&&(b[0]==c[0])&&(a[0]==a[2])&&(a[2]==b[1])&&(b[1]==c[1]))
return 2;
if((a[3]==b[0])&&(a[2]==b[1])&&(a[1]==c[0])&&(a[0]==c[1]))
return 1;
else
return 0;
}
(代码copy自蓝桥官网练习界面一个大佬的题解,虽然时间超时了,但是算法思想值得学习。重点是八位数的每一位该如何表示以及回文数的判别方法)