2021年9月9日,张三想约一直暗恋了很久的的女生小芳看电影,小芳告诉张三这天没空,可以答应在某年某月某日陪他一起看。输入一个约会的日期,请你编写程序判断最终张三是否能实现他约会的愿望,若能实现则输出yes,否则输出no。注意,约会不能穿越到2021年9月9日前。
输入格式:
在一行中输入年月日,用-分隔。
输出格式:
合法的日期输出yes,不合法的日期输出no
输入样例1:
2022-7-7
输出样例1:
yes
输入样例2:
2022-2-29
输出样例2:
no
输入样例3:
2021-2-28
输出样例3:
no
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
-
在
main
函数中,通过scanf
方法读入日期字符串,使用"-"作为分隔符。 -
根据约会时间不能早于2021-09-09的规定,如果输入的日期早于该日期,则直接输出"no"并结束程序。
-
判断输入的月份和日数是否合法。如果不合法,输出"no";否则输出"yes"。在判断日数是否合法时,有以下几种情况:
- 月份为2月:闰年的2月有29天,平年的2月只有28天。
- 月份为4、6、9、11:这些月份只有30天。
- 闰年判断year % 4 == 0 && year % 100 != 0 || year % 400 == 0
代码:
#include <stdio.h>
int main() {
int year, month, day;
scanf("%d-%d-%d", &year, &month, &day);
if (year < 2021 || (year == 2021 && (month < 9 || (month == 9 && day <= 9)))) {
printf("no\n");
} else if (month < 1 || month > 12) {
printf("no\n");
} else if (day < 1 || (month == 2 && day > 28 + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) || day > 31 || (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11))) {
printf("no\n");
} else {
printf("yes\n");
}
return 0;
}
if (year < 2021 || (year == 2021 && (month < 9 || (month == 9 && day <= 9))))
year < 2021:如果输入的年份小于2021年,说明约会时间在2021年9月9日之前,直接输出"no";
(year == 2021 && (month < 9 || (month == 9 && day <= 9))):如果输入的年份是2021年,在判断月份和日期是否在9月9日之前,如果是,则输出"no"。
所以,当输入的日期早于2021年9月9日时,输出"no"。反之,才会进入接下来的判断语句。
else if (day < 1 || (month == 2 && day > 28 + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) || day > 31 || (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11)))
如果日期day小于1,则日期不合法。
如果月份为2(即二月),如果年份是闰年,则最多有29天;否则最多有28天。
如果日期大于31天,则日期不合法。
如果月份是4、6、9或11,并且日期大于30天,则日期不合法。
这个if语句正是通过这些判断来验证输入的日期是否合法。如果上述任意一种情况成立,则会输出"no"。