PTA千年一遇对称日

在 2021 年 12 月 2 日这天,有人发了这么一张图,上书“千年一遇对称日,万事圆满在今朝”。话是挺吉利的,但好像下一个对称日并不需要等上一千年…… 下面任给一个人的生卒年份,请你列出来这个人一辈子经过的所有对称日。

输入格式:

输入第一行给出一个人的名字,是由不超过30个字符的英文字母和空格组成的、以回车结束的非空字符串。第二行按 yyyymmdd - yyyymmdd 的格式给出这个人的生卒年(yyyy)、月(mm)、日(dd)。

虽然生卒日期可能是虚构的,但题目保证出生日期在去世日期之前,且每个日期都是合法的,从 00010101 到 99991231。注意这里遵循“四年一闰,百年不闰,四百年再闰”的规则定义闰年,即年份是 4 的倍数,且不是 100 的倍数的,为普通闰年;年份是整百数的,必须是 400 的倍数才是闰年。闰年跟普通年的区别就是 2 月有 29 天。

输出格式:

首先在第一行原样输出这个人的名字。随后按照时间顺序,每行输出该人所经历的一个对称日,格式与输入格式相同。注意:生卒日期也包含在内。

输入样例:

Katherine Johnson
19180826 - 20200224

输出样例:

Katherine Johnson
20011002
20100102
20111102
20200202

AC代码:

#include<bits/stdc++.h>
using namespace std;
bool leap(int y)//判断闰年leap year 
{
	if((y%4==0&&y%100!=0)||y%400==0) return true;
	else return false;
}
int main()
{
	int mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	string na;
	getline(cin,na);
	cout<<na<<endl;
	string s,t;
	cin>>s>>t>>t;
	int y=stoi(s.substr(0,4));
	int m=stoi(s.substr(4,2));
	int d=stoi(s.substr(6,2));
	int end=stoi(t);
	while(y*10000+m*100+d<=end)
	{
		//利用月和日反过来等于年份来判断是否对称
//      !如果用下列四行字符串反转月和日的方法因复杂度比较大会有一个测试点运行超时! 
//		string st=to_string(y*10000+m*100+d);
//		string ss=st.substr(4,4);
//		reverse(ss.begin(),ss.end());
//		int x=stoi(ss);
		int x=d%10*10+d/10;
		x=x*100+m%10*10+m/10;
		if(x==y) printf("%04d%02d%02d\n",y,m,d);
		if(m==2&&d==28&&leap(y)) d=29;
		else//递增到下一个日期 
		{
			if(d<mon[m]) d++;
			else
			{
				d=1;
				if(m==12) m=1,y++;
				else m++;
			}
		}
	}
	return 0;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北边一颗小星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值