题目:统计起始日期之间有多少个2月29。
#include <iostream>
#include <string>
using namespace std;
class Date
{
private:
int month;
int day;
int year;
static int getMonthFromString(const string &s)
{
static const string months_str[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
for (int i = 0; i < 12; ++i)
if (!months_str[i].compare(s))
return i + 1;
return 0;
}
bool isNotAfter0229() const
{
if (month < 2) return true;
if (month == 2 && day <= 29) return true;
return false;
}
bool isNotBefore0229() const
{
if (month > 2) return true;
if (month == 2 && day == 29) return true;
return false;
}
bool isLeapYear() const
{
if (!(year % 400)) return true;
if (!(year % 4) && (year % 100)) return true;
return false;
}
bool isLeapYear(int y) const
{
if (!(y % 400)) return true;
if (!(y % 4) && (y % 100)) return true;
return false;
}
public:
Date(string m, int d, int y) : month(getMonthFromString(m)), day(d), year(y) {}
int count0229tillDate(const Date &end_date)
{
int count = 0;
if (end_date.year == year)
{
if (isLeapYear() && isNotAfter0229() && end_date.isNotBefore0229())
++count;
}
else
{
if (isLeapYear() && isNotAfter0229()) ++count;
for (int i = year + 1; i < end_date.year; ++i)
if (isLeapYear(i))
++count;
if (end_date.isLeapYear() && end_date.isNotBefore0229()) ++count;
}
return count;
}
};
int main()
{
int T = 0;
cin >> T;
for (int t = 1; t <= T; ++t)
{
string start_month, end_month;
char comma;
int start_day, end_day;
int start_year, end_year;
cin >> start_month >> start_day >> comma >> start_year;
cin >> end_month >> end_day >> comma >> end_year;
Date start_date(start_month, start_day, start_year);
Date end_date(end_month, end_day, end_year);
cout << "Case #" << t << ": " << start_date.count0229tillDate(end_date) << endl;
}
return 0;
}
原文地址:http://blog.csdn.net/chfe007/article/details/45136245