AcWing 2867. 回文日期
原题链接
简单
作者:
王思进さなファン
,
2021-04-05 13:52:33
,
所有人可见
,
阅读 249
C++ 代码
#include <iostream>
//#include <cstring>
using namespace std ;
string get(int year) //由前4位年份 得到后面的4位月份和日期
{
string s = "" ;
while(year)
{
char c = year % 10 + '0';
s += c ;
year = year / 10 ;
}
return s;
}
bool check(string last ,int y)//检查后面的4位日期是否是合法的日期
{
int month , day ;
month = (last[0] - '0') * 10 + last[1] - '0' ;
day = (last[2] - '0') * 10 + last[3] -'0' ;
if(month >= 1 && month <= 12)
{
if(month == 2)
{
if( (y % 4 == 0 && y % 100 || y % 400 == 0) && day <= 29 ) return true ;
else if(day <= 28) return true ;
}
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
if(day <= 31 && day >= 0 )
return true ;
}
else if(day <= 30 && day >= 0 ) return true ;
}
return false ;
}
bool check_AB(int x)//检查是否是AB型的年份
{
int a = x / 100 ;
int b = x % 100 ;
int aa = a / 10 , ab = a % 10 ;
if(a == b && aa != ab) return true ;
else return false ;
}
bool check_huiwen(int x)//检查输入日期是否是回文数
{
string date = to_string(x) ;
for(int i = 0 , j = 7 ; i < 8 ; i ++ , j --)
{
if(date[i] != date[j]) return false;
}
return true ;
}
//2020 0202
int main ()
{
int n ;
cin >> n ;
int t = n;
n = n / 10000 ;
if(!check_huiwen(t)) n = n - 1 ;//对于不是回文日期的输入 , 就从这一年开始判断 因为后面的n + 1 了
for(int i = n + 1 ; i <= 9090 ; i ++)
{
string last= get(i) ;
if(check(last , i))
{
cout << i << last << endl ;
break;
}
}
for(int i = n + 1 ; i <= 9090 ; i ++)
{
if(check_AB(i))//先判断是否是AB型
{
string last= get(i) ;//由年份得到日期
if(check(last , i))//检查是否是合法的日期
{
cout << i << last << endl ;
break;
}
}
}
return 0 ;
}