注意:1.时间限制 2.需要判断是否是合法日期 3.判断AB型
之前一直超时,原因是每次循环还要判断日期是否合法,后来我直接用数日历的方式,让日期在合法的范围跑就不用判断日期是否合法。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
//判断是否是回文日期
bool huiwen(string str)
{
string str1 = str;
reverse(str1.begin(), str1.end());
if (str1 != str) return false;
return true;
}
//判断是否是AB型日期
bool ab(string str)
{
if (str[0] == str[2] && str[1] == str[3] && str[0] != str[1])
return true;
return false;
}
//闰年判断
bool isleap(int y)
{
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) return true;
return false;
}
int main()
{
int n;
cin >> n;
int y, m, d;
y = n / 10000;
m = n % 10000 / 100;
d = n % 100;
int ans1 = 0, ans2 = 0;
while (1)
{
d++;
if (d == 32 && m == 12)
{
m = 1;
d = 1;
y++;
}
if (d == 32 && (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10))
d = 1, m++;
if (d == 31 && (m == 4 || m == 6 || m == 9 || m == 11))
d = 1, m++;
if (d == 30 && m == 2 && isleap(y))
d = 1, m++;
if (d == 29 && m == 2 && !isleap(y))
d = 1, m++;
int num = y * 10000 + m * 100 + d;
string str = to_string(num);
if (huiwen(str))
{
if (!ans1) ans1 = num;
if (!ans2 && ab(str))
{
ans2 = num;
break;
}
}
}
cout << ans1 << endl;
cout << ans2 << endl;
return 0;
}