母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。
输入:
年份
输出:
日期(5月的哪一天)
测试输入 | 期待的输出 | 时间限制 |
---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
|
#include <stdio.h>
#include <time.h>
int main() {
int year;
scanf("%d", &year); // 读取输入的年份
// 设置日期为目标年份的5月1日 (1900形式)
struct tm timeinfo = {0};
timeinfo.tm_year = year - 1900; // time.h 中的年份是从1900年开始计算的
timeinfo.tm_mon = 4; // 月份从0开始计数,5月是4
timeinfo.tm_mday = 1; // 日期设置为1
// mktime 调整日期结构(1970形式)并计算出星期几
mktime(&timeinfo);
int dayOfWeek = timeinfo.tm_wday; // 星期几(0是星期天)
// 计算第二个星期天:首先找到第一个星期天
int firstSunday = (dayOfWeek == 0) ? 1 : 8 - dayOfWeek; // 记得注意dayOfWeek已经星期几
int secondSunday = firstSunday + 7; // 第二个星期天
printf("%d\n", secondSunday); // 输出五月的第二个星期天的日期数字
return 0;
}
1. 初始化时间信息
首先,我们设置了一个日期,是目标年份的5月1日:
struct tm timeinfo = {0}; timeinfo.tm_year = year - 1900; // 设置年份 timeinfo.tm_mon = 4; // 月份为五月(从0开始计数,所以4代表五月) timeinfo.tm_mday = 1; // 日期为1号
这样我们就定义了一个具体的日期,即某年的5月1日。
2. 使用 mktime
mktime
是一个非常有用的函数,它可以做两件事:
- 把
struct tm
类型的分解时间转换为time_t
类型的时间戳(这部分在我们的代码中不直接用到)。 - 重要的是,它可以根据年、月、日计算出那天是星期几,并更新
struct tm
结构体中的tm_wday
字段。
mktime(&timeinfo);
执行这行代码后,timeinfo.tm_wday
就会被设置成5月1日那天的星期数,其中0代表星期天,1代表星期一,依此类推。
3. 确定第一个星期天
现在我们知道了5月1日是星期几,接下来的目标是找出五月的第一个星期天。
int dayOfWeek = timeinfo.tm_wday; // 5月1日是星期几 int firstSunday = (dayOfWeek == 0) ? 1 : 8 - dayOfWeek;
- 如果
dayOfWeek
为0,说明5月1日已经是星期天,所以第一个星期天就是1号。 - 如果不是0,比如说是1(星期一),那第一个星期天是从1号起算的第一个星期天,也就是5月1日后的第一个星期天(8 - 1 = 7,即5月7日)。
4. 计算第二个星期天
一旦我们有了第一个星期天,第二个星期天很容易得出,只需要在第一个星期天的基础上加7天:
int secondSunday = firstSunday + 7;
简化概括
- 设定日期:我们先设定一个日期,这里是某年的5月1日。
- 计算星期:使用
mktime
函数计算出这个日期是星期几。 - 找星期天:基于得到的星期数,计算出该月的第一个星期天是哪一天。
- 得到第二个星期天:在第一个星期天的日期基础上加7天。