算一下从公元纪年开始到现在,总共有多少个回文日
问题
今天是2021.12.02,这串数字无论正读还是反读都是一样的,这种日期形式称为“回文日”。
朋友圈流行着这样一张图片
“千年难遇”?我不信,所以我打算写个代码跑一跑。
所考虑情况为月和日均为两位数,如2001.1.5记作2001.01.05,年份则不含前缀0.
代码
#include<bits/stdc++.h>
using namespace std;
int ans;
int m; //判断月份
int isleap(int x) //判断是否为闰年
{
if(x%4==0&&x%100!=0)
return 1;
if(x%400==0)
return 1;
else return 0;
}
string itoc(int x) //将数字转成字符
{
string s="";
while(x)
{
char q='0'+(x%10-0);
s=q+s;
x/=10;
}
return s;
}
int check(string s) //检查是否为回文字符串
{
int len=s.size();
for(int i=0;i<len/2;i++)
{
if(s[i]!=s[len-i-1])
return 0;
}
return 1;
}
int main()
{
for(int i=1;i<=2022;i++)
for(int j=1;j<=12;j++)
{
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) // 每月31天的月份
m=31;
if(j==4||j==6||j==9||j==11) //每月30天的月份
m=30;
if(j==2) //2月需判别是否为闰年
{
if(isleap(i))
m=29;
else m=28;
}
for(int k=1;k<=m;k++)
{
string s="";
s+=itoc(i)+itoc(j)+itoc(k); //将日期转换成字符串
if(check(s))
{
cout<<i<<'.'<<j<<'.'<<k<<endl;
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
结果
代码跑出来的结果是这样:
也就是说从公元纪年开始到今天(2021.12.02)总共有513个回文日,看来并不是千年难遇。
为了使结果更严谨也更具说服力,我决定跑一下从1021.12.02年到今天,也就是最近一千年有多少个回文日。
结果如下:
结果是43,1000/43=23,也就是平均每至少24年就有一个回文日,并不是“千年难遇”。