蓝桥杯刷题-lanqiao 498(回文日期-模拟)

一、分析

1.string到int和int到string的转换函数(int到string时最后记得翻转string)

2.提取出输入内容的年月日

3.枚举日期(年从输入的year到9999,月从1到12,日从1到31,年相等月小的不要,年相等月相等日小于等于的不要)

4.判断是否为合法日期(用数组)

5.判断是否回文(a[i]==a[a.length()-i-1;遍历长度为i<a.length()/2)

6.判断是否是ABABBABA类型(先必须是回文,然后a[0]==a[2], a[1]==a[3])

二、新学到的知识点

1.用cout<<setfill('0')<<setw(宽度)来实现输出整数时宽度不够左边补0

2.整数加'0’可以转为char类型的数

三、代码

#include <bits/stdc++.h>
using namespace std;
//11:00 回文日期 
int string2int(string s){
	int result=0;
	
	for(const auto&i:s){
		result=result*10+i-'0';
	}
	
	return result;
}
string int2string(int x){
	string result="";
	
	while(x){
		int shu=x%10;
		char y=shu+'0';
		result=result+y;
		x/=10;
	}
	
	reverse(result.begin(),result.end());
	return result;
}
bool checkislegal(int year,int month,int day){
	//各月的天数 
	int legalday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	//是否闰年 
	if(year%400==0||year%4==0&&year%100!=0){
		legalday[2]=29;
	}

	if(legalday[month]<day)return false;
	
	return true;
}
bool checkishuiwen(string s){
	for(int i=0;i<s.length()/2;i++){
		if(s[i]!=s[s.length()-i-1])return false;
	}
	
	return true;
}
bool checkisabab(string s){
	if(!checkishuiwen(s))return false;
	if(s[0]==s[2]&&s[1]==s[3])return true;
	else return false;
}

int main(){
	//输入日期 
	string s;
	cin>>s;
	
	int year,month,day;
	
	//提取日期 
	year=string2int(s.substr(0,4));
	month=string2int(s.substr(4,2));
	day=string2int(s.substr(6,2));
	
	//枚举日期 
	int flaghuiwen=0;
	int flagabab=0;
	for(int i=year;i<=9999;i++){
		for(int j=1;j<=12;j++){
			for(int k=1;k<=31;k++){
				//输入日期及其之前的不可取
				if(i==year&&j<month)continue;
				if(i==year&&j==month&&k<=day)continue;
				//找出满足要求的
				if(!checkislegal(i,j,k)) continue;//不是合法日期不行
				if(checkishuiwen(int2string(i*10000+j*100+k))){
					if(flaghuiwen==0)
				{
					cout<<setfill('0')<<setw(4)<<i;
					cout<<setfill('0')<<setw(2)<<j;
					cout<<setfill('0')<<setw(2)<<k;
					
					flaghuiwen=1;
					cout<<endl;
				}
					
				}
				if(checkisabab(int2string(i*10000+j*100+k))&&flaghuiwen){
					if(flagabab==0){
					cout<<setfill('0')<<setw(4)<<i;
					cout<<setfill('0')<<setw(2)<<j;
					cout<<setfill('0')<<setw(2)<<k;
					
					flagabab=1;
					return 0;
				}
					
					
				}
				
				
			}
		}
	}
	return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值