迴文日期
題目
在日常生活中,通過年、月、日這三個要素可以表示出一個唯一確定的日期。
牛牛習慣用 8 位數字表示一個日期,其中,前 4 位代表年份,接下來 2 位代表月份,最後 2 位代表日期。
顯然:一個日期只有一種表示方法,而兩個不同的日期的表示方法不會相同。
牛牛認爲,一個日期是迴文的,當且僅當表示這個日期的8位數字是迴文的。
現在,牛牛想知道:在他指定的兩個日期之間(包含這兩個日期本身),有多少個真實存在的日期是迴文的。
一個 8 位數字是迴文的,當且僅當對於所有的 i(1≤i≤8) 從左向右數的第i個數字和第 9−i 個數字(即從右向左數的第 i 個數字)是相同的。
例如:
- 對於2016年11月19日,用 8 位數字 20161119 表示,它不是迴文的。
- 對於2010年1月2日,用 8 位數字 20100102 表示,它是迴文的。
- 對於2010年10月2日,用 8 位數字 20101002 表示,它不是迴文的。
輸入格式
輸入包括兩行,每行包括一個8位數字。
第一行表示牛牛指定的起始日期date1,第二行表示牛牛指定的終止日期date2。保證date1和date2都是真實存在的日期,且年份部分一定爲4位數字,且首位數字不爲0。
保證date1一定不晚於date2。
輸出格式
輸出共一行,包含一個整數,表示在date1和date2之間,有多少個日期是迴文的。
輸入樣例
20110101
20111231
輸出樣例
1
題解
思路
- 首先構造迴文數
- 判斷其是否在給定日期期間
- 判斷其是否符合日期的格式與範圍
#include <iostream>
using namespace std;
int n, m, md[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int x) {
int year = x / 10000, month = x % 10000 / 100, day = x % 100;
if (month < 1 || month > 12) return false;
if (day < 1 || month != 2 && day > md[month]) return false;
if (month == 2) {
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if (day > md[month] + leap) return false;
}
return true;
}
int main () {
cin >> n >> m;
int res = 0;
for (int i = 1000; i <= 9999; i ++) {
int num = i, x = i;
for (int j = 0; j < 4; j ++) num = num * 10 + x % 10, x /= 10;
if (num >= n && num <= m && check(num)) res ++;
}
cout << res;
return 0;
}