2020年ブルーブリッジカップC/C++省試合B組第2戦G:回文日付


【問題の説明】2020年の春節期間中、2020年2月2日という特別な日付が注目されました.この日付を「yyyyymmdd」の形式で8桁に書くと20200202となり、ちょうど1回の文数になるからです.私たちはこのような日付を返事の日付と呼んでいます.20200202は「千年に一度」という特別な日だという人もいる.これに対して明ちゃんはとても認めません.2年もしないうちに次の返事の日付です.20211202、2021年12月2日です.20200202は1つの返信日だけでなく、ABABBABA型の返信日でもあるという人もいます.これに対して明ちゃんも認めていません.約100年後に次のABABBABA型の返信日:21211212、2121年12月12日に出会うことができるからです.「千年に一度」ではなく、せいぜい「千年に二度」だ.8桁の日付を指定して、その日付の後に次の返信日と次のABABBABA型の返信日がそれぞれどの日なのか計算してください.
【入力形式】入力は、日付を表す8ビット整数Nを含む.
【出力形式】2行出力し、1行あたり8桁.1行目は次の返信日、2行目は次のABABBABA型の返信日を表します.【サンプル入力】
20200202

【サンプル出力】
20211202
21211212

【評価用例の規模と約定】すべての評価用例について、100000101≦N≦89991231であり、Nが合法的な日付の8桁の表示であることを保証する.コード:
#include 
#include 
using namespace std;
int a[12]={
     31,28,31,30,31,30,31,31,30,31,30,31};
bool isok(int x)//    
{
     
	if( x%400==0 )	return true;
	if( x%100==0 )	return false;
	if( x%4==0 )	return true;
	return false;
}
int main()
{
     
	int x; 
	cin >> x;
	int year=x/10000;//     
	int month=x%10000/100;//     
	int day=x%100;//     
	int flag=0;
	
	int m=year%10*10+year%100/10;//         
	int n=year/100%10*10+year/1000;//        
	
	if(isok(year)) a[1]=29;
	else a[1]=28;
	
	if((m>month&&m<13)||(m==month&&n>day&&n<=a[m-1])){
     //                 
		cout<<setw(2)<<setfill('0')<<year<<setw(2)<<setfill('0')<<m<<setw(2)<<setfill('0')<<n<<endl;//           
		flag=1;
		if((year/1000!=year%10)&&(year%100==m%10*10+m/10)&&(m==n)){
      //              ABAB BABA    
			cout<<setw(2)<<setfill('0')<<year<<setw(2)<<setfill('0')<<m<<setw(2)<<setfill('0')<<n<<endl;
			return 0;
		}
	}
		
	while(year<=8999){
     
		year++;	
		month=year%10*10+year%100/10;//      
		day=year/100%10*10+year/1000;//     
		if(month>12||day>31) continue;
		
		if(isok(year)) a[1]=29;
		else a[1]=28;
		
		if((flag!=1)&&month>0&&month<13&&day>0&&day<=a[month-1]){
     //     
			cout<<setw(2)<<setfill('0')<<year<<setw(2)<<setfill('0')<<month<<setw(2)<<setfill('0')<<day<<endl;
			flag=1;
		}
	
		if((year/1000!=year%10)&&(year%100==month%10*10+month/10)&&(month==day)){
     // ABABBABA  
			cout<<setw(2)<<setfill('0')<<year<<setw(2)<<setfill('0')<<month<<setw(2)<<setfill('0')<<day<<endl;
			break;
		}
	}
	
	return 0;
}


この問題は次のとおりです.https://blog.csdn.net/weixin_45672809/article/details/109137199
皆さん、ありがとうございました.