题目
思路
思路1:先把所有日期表示出来,然后判断每个日期是否是回文
这个思路理论上可行,但表示所有日期比较困难
思路2:先把所有的回文日期表示出来,判断日期是否合法,
是否在给定的两个日期之间
比思路1简单一些,本文讲解思路2的写法
代码
#include<stdio.h>
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//存12个月份的日期
int ret = 0;//计数
int pd(int n)//判断日期是否合法
{
int year = n / 10000;
int mont = (n % 10000) / 100;
int day = n % 100;
if (year == 0)
{
return 0;
}
if (mont < 1 || mont>12)
{
return 0;
}
if (mont == 2)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
month[2] = 29;
}
}
if (day<1 || day>month[mont])
{
return 0;
}
month[2] = 28;
return 1;
}
int main ()
{
int a=0,b=0;
scanf("%d",&a);
scanf("%d",&b);
for(int i=1000;i<=9999;i++)//先产生回文数
{
int date=i,x=i;//不可在此处对i进行改动,改动i可能使程序崩溃;
for(int j=0;j<4;j++)//将1000到9999数变为回文数
{
date=date*10+x%10;
x/=10;
}
if(a<=date&&date<=b&&pd(date)==1)//日期合法,在a,b间,为一个合法方案;
{
ret++;
}
}
printf("%d",ret);
}
创作不易,请各位多多三连支持
也请各位斧正