题目描述:
题解
个人添加了注释,答案由学校课程组给出,不是原创回答
#include<bits/stdc++.h>
using namespace std;
int dayNum[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool checkYear(int x) //判断给出的年份x是否为闰年
{
if(x%400==0) return true;
if(x%4==0&&x%100!=0) return true;
return false;
}
void nxt(int &a,int &b,int &c) //移动到下一个日期
{
bool flag = checkYear(a);
if(flag) dayNum[2]++;
c++;
if(c>dayNum[b])
{
c = 1;
b++;
}
if(b>12)
{
b = 1;
a++;
}
if(flag) dayNum[2]--;
}
int d[10];
int pos;
bool check(int a,int b,int c) //检查a年b月c日是否是回文日期
{
pos = 0; //pos为回文数的位数
while(c)
{
//数字处理的非常巧妙,循环使用%10和/10的方式
//把年月日每一位数字计入d[10]中
d[pos++] = c%10;
c/=10;
}
while(b)
{
d[pos++] = b%10;
b/=10;
}
while(a)
{
d[pos++] = a%10;
a/=10;
}
for(int i=0;i<pos;i++)
{
if(d[i]!=d[pos-i-1]) //比较d[10]数组是否回文
return false;
}
return true;
}
int main()
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
int a,b,c;
a = b = c = 1;
int ans = 0;
while(1)
{
if(check(a,b,c))
ans++; //符合要求的年份数目+1
if(a==x&&b==y&&c==z) //到达a年b月c日,题目已保证a, b, c合法
break;
nxt(a,b,c);
}
printf("%d\n",ans);
return 0;
}