算一下从公元纪年开始到现在,总共有多少个回文日

问题

今天是2021.12.02,这串数字无论正读还是反读都是一样的,这种日期形式称为“回文日”。
朋友圈流行着这样一张图片
mmexport1638413444031
“千年难遇”?我不信,所以我打算写个代码跑一跑。
所考虑情况为月和日均为两位数,如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年就有一个回文日,并不是“千年难遇”

posted @ 2021-12-02 20:10  longwind7  阅读(180)  评论(0编辑  收藏  举报