中国有句俗话“三天打鱼两天晒网”。某同学从2010年1月1日开始,坚持三天学习两天休息。比如2010年1月1、2、3日学习,4、5日休息。6、7、8日学习,9,10日休息。现任意输入一个年、月、日。问这天是学习还是休息。要求:输入年、月、日为整数;输出的格式为:“XXXX年X月X日 休息(或者学习)”1.代码比单元格长没有关系。2.每个变量要用一条输入语句。且必须按题目要求顺序输入。3.只能使用scanf()或者gets()输入
时间: 2023-12-18 08:03:17 浏览: 170
三天打鱼两天晒网
好的,以下是实现该功能的代码:
```
#include <stdio.h>
int main() {
int year, month, day;
int days_from_2010_01_01;
scanf("%d%d%d", &year, &month, &day);
days_from_2010_01_01 = (year - 2010) * 365 + (year - 2009) / 4 - (year - 2001) / 100 + (year - 1601) / 400;
switch (month - 1) {
case 11:
days_from_2010_01_01 += 30;
case 10:
days_from_2010_01_01 += 31;
case 9:
days_from_2010_01_01 += 30;
case 8:
days_from_2010_01_01 += 31;
case 7:
days_from_2010_01_01 += 31;
case 6:
days_from_2010_01_01 += 30;
case 5:
days_from_2010_01_01 += 31;
case 4:
days_from_2010_01_01 += 30;
case 3:
days_from_2010_01_01 += 31;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
days_from_2010_01_01 += 29;
} else {
days_from_2010_01_01 += 28;
}
case 1:
days_from_2010_01_01 += 31;
}
days_from_2010_01_01 += day - 1;
if ((days_from_2010_01_01 + 1) % 5 <= 2) {
printf("%d年%d月%d日 学习", year, month, day);
} else {
printf("%d年%d月%d日 休息", year, month, day);
}
return 0;
}
```
解释一下代码:
首先定义了三个整型变量 `year`、`month` 和 `day` 用于存储输入的年月日。然后使用 `scanf` 函数读取这三个值。
接着,我们需要计算从2010年1月1日到输入日期的天数。我们可以使用蔡勒公式来计算,但是这个公式比较复杂,我们可以使用一个简化版的公式:`(year - 2010) * 365 + (year - 2009) / 4 - (year - 2001) / 100 + (year - 1601) / 400`。这个公式可以算出从1601年1月1日到输入日期的天数,然后减去1601年1月1日到2010年1月1日的天数即可。
接着,我们使用 `switch` 语句来计算输入日期的月份之前的所有天数。需要注意的是,`switch` 语句中要注意 `break` 语句的使用,以避免出现逻辑错误。
最后,我们计算出从2010年1月1日到输入日期的天数 `days_from_2010_01_01`,然后判断 `days_from_2010_01_01` 所对应的星期数是第几天。如果是第1、2、3天,就是学习;如果是第4、5天,就是休息。
最后,使用 `printf` 函数输出结果即可。
阅读全文