#31. 日期合法性

日期合法性

你已经和老师一起看清了很多程序语言中的“是非”,这下,你又需要在没有老师的任何帮助下完成一个任务啦。

这次的题目也不是很难。测试程序将随机给你一个空格分隔了年、月、日的日期(其中的数字都是没有前导零的,也就是说7不会被写成07)。你将需要判断这个日期在我们的公历体系内是否真实存在。如果存在则输出YES,否则输出NO(注意输出的字母都一定是大写字母)。

测试程序给出的测试输入数据中,年、月、日都是正整数(也就是大于零的整数),均不大于 30003000

已知,一年有 1 月到 12 月,共 1212 个不同的月份;其中 1 月、3 月、5 月、7 月、8 月、10 月、12 月有 3131 个合法的日,分别为 1 日到 31 日;4 月、6 月、9 月、11 月有 3030 个合法的日,分别为 1 日到 30 日。对于闰年,2 月有 2929 个合法的日,分别为 1 日到 29 日;对于平年(不是闰年的年称为平年),2 月有 2828 个合法的日,分别为 1 日到 28日。

对于不大于 3000 年的年份,闰年遵循如下规律:

  • 非整百年,能被 44 整除的为闰年。
  • 整百年,能被 400400 整除的是闰年。

之后呢,你需要做很多的判断,会嵌套地用到我们已经学的if...else...的结构。你将需要:

  • 判断输入日期中的月份是不是合法的月份(这里特殊情况最少,建议第一层先判断);
  • 针对每个月的日数判断输入日期中日的合法性;
  • 注意抓住特殊的 2 月,在里面讨论年的问题(看是不是闰年);
    • 对于闰年,允许 29 日的存在
    • 对于非闰年不能允许 29 日的存在。

习题目的

  • 练习 % 运算
  • 练习使用 if
  • 练习 if 嵌套
  • 练习使用 else

输出时每行末尾的多余空格,不影响答案正确性

样例输入1

2016 2 29

样例输出1

YES

样例输入2

1900 2 29

样例输出2

NO

样例输入3

2016 13 32

样例输出3

NO