题目描述
现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的
样例
输入样例:
20110101
20111231
输出样例:
1
算法1(自己实现的代码)
算法1时间几乎是算法2的一半
C++ 代码
#include <iostream>
using namespace std;
//判断是否为闰年
bool isLeapYear(int year) {
// 如果能够被400整除,或者能够被4整除但不能被100整除,则是闰年
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
return true;
} else {
return false;
}
}
int main()
{
int n, m;
cin >> n >> m;
int start, end, a, b, c, d;
start = n / 10000;
end = m / 10000;
a = (n % 10000) / 100;//初始年的月
b = (n % 10000) % 100;//初始年的日
c = (m % 10000) / 100;//结束年的月
d = (m % 10000) % 100;//结束年的日
int count = 0;
for(int i = start; i <= end; i++)//遍历输入区间的年份
{
int t = i / 100;
int p = (i % 10) * 10 + i / 10 % 10;//当前年的月
int q = (t % 10) * 10 + t / 10 % 10;//当前年的日
if(i == start && ((p < a) || ( p == a && q < b))) continue;//早于初始年月日
if(i == end && ((p > c) || ( p == c && q > d))) continue;//晚于结束年月日
//判断月和日是否真实存在
if(((p == 1) || (p == 3) || (p == 5) || (p == 7) || (p == 8) || (p == 10) || (p == 12)) && (q >= 1 && q <= 31)) count++;
else if((p == 4 ||p == 6 ||p == 9 ||p == 11) && (q >= 1 && q <= 30)) count++;
else if( (p == 2) && ((q >= 1 && q <= 29 && isLeapYear(i)) || (q >= 1 && q <= 28 && !isLeapYear(i))) ) count++;
}
cout << count << endl;
return 0;
}
算法2(y总的代码)
y总的代码主打一个优雅
C++ 代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check_valid(int date)
{
int year = date / 10000;
int month = date % 10000 / 100;
int day = date % 100;
if (month == 0 || month > 12) return false;
if (day == 0 || month != 2 && day > days[month]) return false;
if (month == 2)
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if (day > 28 + leap) return false;
}
return true;
}
int main()
{
int date1, date2;
cin >> date1 >> date2;
int res = 0;
for (int i = 1000; i < 10000; i ++ )
{
int date = i, x = i;
for (int j = 0; j < 4; j ++ ) date = date * 10 + x % 10, x /= 10;
if (date1 <= date && date <= date2 && check_valid(date)) res ++ ;
}
cout << res << endl;
return 0;
}