技巧:
枚举 - 缩小规模
思路:
将所有可能的月份和日排列组合然后翻转 看翻转后的值是否在给定的日期范围内。
实现:
package main
import (
"fmt"
"strconv"
)
func main() {
var begin, end string
fmt.Scan(&begin, &end)
// 开始年份 int
beginYearInt, _ := strconv.Atoi(begin[:4])
// 结束年份 int
endYearInt, _ := strconv.Atoi(end[:4])
// 每月有几天
monthDays := []int{-1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
ans := 0
// 枚举月和日的组合
for i := 1; i <= 12; i++ {
monthStr := ""
if i < 10 {
monthStr = "0"
}
monthStr = fmt.Sprintf("%s%d", monthStr, i)
for j := 1; j <= monthDays[i]; j++ {
dayStr := ""
if j < 10 {
dayStr = "0"
}
dayStr = fmt.Sprintf("%s%d", dayStr, j)
// 将月和日字符串拼接然后回文
surffix := []byte(monthStr + dayStr)
for k := 0; k < 2; k++ {
surffix[k], surffix[3-k] = surffix[3-k], surffix[k]
}
//获取回文后的年份并判断是否在给定年份范围内
year, _ := strconv.Atoi(string(surffix))
if year >= beginYearInt && year <= endYearInt {
// 排除闰年
if year%4 == 0 && year%100 != 0 && year%400 == 0 && i == 2 && j > 28 {
continue
}
ans++
}
}
}
fmt.Println(ans)
}

京公网安备 11010502036488号