今天是世界完全對稱日(2011 1102),所以就想寫一個算法來計算一段時間內所有的完全對稱日。看看有多少日期是世界完全對稱日
描述:
輸入開始和結束年份,求出其中所有的完全對稱日。
輸入:
輸入開始年份startYear和結束年份endYear (startYear < endYear);
輸出:
輸出所要求的完全對稱日。
解題思路:
1)根據月份和天,逆序後算出對應的年份的日期 (如1月1號 -> 0101 -> 1010,則年份是1010年)
2)判斷計算出來的年份是否在輸入的年份之間
3)排除非閏年時2月29號這個不合法日期
代碼:
#include <vector>
#include <string>
#include <sstream>
#include <iomanip>
#include <algorithm>
using namespace std;
const int MonthDays[] ={
31,29,31,30,31,30,31,31,30,31,30,31
};
class SymmetricalDay
{
public:
bool isLeap(int year)
{
return (( year % 4 == 0 ) && ( year % 100 != 0 ) || ( year % 400 == 0 ));
}
vector<string> getDays(int startYear, int endYear)
{
vector<string> results;
for (int curMonth = 1; curMonth <= 12; ++curMonth)
{
for (int curDay = 1; curDay <= MonthDays[curMonth-1]; ++curDay)
{
ostringstream tempValue;
tempValue << setw(2) << setfill('0') << curMonth;
tempValue << setw(2) << setfill('0') << curDay;
string strData(tempValue.str());
string strReverse(strData.rbegin(), strData.rend());
istringstream yearValue(strReverse);
int curYear = 0;
yearValue >> curYear;
if (curYear >= startYear && curYear <= endYear)
{
if (!isLeap(curYear) && curMonth==2 && curDay==29)
{
continue;
}
string tempResult = yearValue.str() + "" + tempValue.str();
results.push_back(tempResult);
}
}
}
sort(results.begin(), results.end());
return results;
}
};
作者 Quincy