回文日是指日期正讀反讀都一樣的日子,例如 2011年11月02日寫作 20111102,正反對稱。本題要求列出從 2011 年起未來 80 年(至 2091 年)所有的回文日。
year[4],月日拆為 4 位數陣列 monthday[4],再兩兩對比(year[0] vs monthday[3]、year[1] vs monthday[2]…)。CheckYear() 依「四年一閏、百年不閏、四百年再閏」規則實作。const int Day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int CheckYear(int y) {
return (y%100!=0 && y%4==0) || (y%400==0);
}
int CompareNum(int y[], int md[]) {
for (int i=0, j=3; i<4; i++, j--)
if (y[i] != md[j]) return 0;
return 1;
}
int main() {
for (int year=2011; year<=2091; year++) {
// 拆解年份四位數存入 year[4]
// 雙層迴圈遍歷 1~12 月、每月 1~Day[month] 日
// 拆解月日存入 monthday[4]
// 閏年二月特別處理
// CompareNum() 判斷是否回文,是則輸出
}
return 0;
}
程式會輸出類似:
第1個 2011 11 2 是回文日.
第2個 2020 02 2 是回文日.
第3個 2030 03 2 是回文日.
...
第36個 2091 19 2 是回文日.
共找到 36 個回文日(含起始日)。完整列表請見執行截圖。
此題綜合練習了:陣列操作、巢狀迴圈、函式模組化、日期邏輯處理、字元/數字轉換——是 C 語言進階練習的優質素材。
