蓝桥集训之日期问题
核心思想:倒着做
- 正着判断给定字符串是否成立不好做
- 反着从起点到终点遍历每一天 判断是否满足条件 好做
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int days[]={ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool is_valid(int y,int m,int d) //判断该天是否合法 { if(m == 0 || m > 12) return false; if (d == 0) return false; if(m != 2) { if(d > days[m]) return false; } else { int leap = y %100 && y%4==0 || y%400 == 0; if(d > 28+leap) return false; } return true; } int main() { int a,b,c; scanf("%d/%d/%d", &a,&b,&c); for(int date=19600101;date<=20591231;date++) //从1960年1月1开始遍历每天 { //取出年月日 int year = date/10000, month = date%10000/100 , day = date%100; if(is_valid(year,month,day)) { if (year % 100 == a && month == b && day == c || month == a && day == b && year % 100 == c || day == a && month == b &&year % 100 == c) //不足两位前补0 printf("%d-%02d-%02d\n", year, month, day); } } }