目录
一、题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1日周六(含)到 2020年 10 月 1日周四(含)。请问这段时间小蓝总共跑步多少千米?
二、解题思路
1、周一或者月初或者同时当天比平常多跑一千米,那么编写代码时就要有判断周一或者月初或者同时出现(注意:同时是周一或月初也是跑2千米,而不是累加),然后注意年份这个特殊情况,因为闰年2月是29天,所以也要有判断是不是闰年的程序,
2、交代我的最初错误思路:我是先根据2000到2020所有天数,再减去2020年10月1日之后的,就是时间段以来的总天数,总天数再减1,再加3(因为我想开始是从周六结束是周四,额外添加值,满足7的整数),最后加上月数。运行错误,知道为什么吗?
因为忽略了同时是周一和月初还是多跑一千米的,,我最初的思路结果是同时时进行了累加
3、正确思路:首先判断年份是不是闰年,需要确定每年的2月份的天数,然后判断每个月每天是周几,如果是周一或者月初或者同时,跑的数目需要多加1,(因为开始是从周六,定义week=6,遇到第一个周一时,此时week=8,重新赋值week=1,再week++,这样就满足周一到周日的条件)
三、操作代码
#include<stdio.h>
int main()
{
int year_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int weak=6,count=0;
int year=0,day=0,month=0;
for(year=2000;year<=2020;year++)
{
if(year%4==0&&year%100!=0||year%400==0) //判断是不是闰年(两种条件:1、是4的倍数同时不是100的倍数,2、世纪年份,400的倍数)
year_month[2]=29;
else
year_month[2]=28;
for(month=1;month<=12;month++)
{
for(day=1;day<=year_month[month];day++)
{
count++; //每天跑的一千米
if(weak==8)
weak=1;
if(weak==1||day==1)
count++; //周一和月初或者同时多跑的一千米
weak++; //week=1是周一,周几随着天数继续++
if(year==2020&&month==10&&day==1) //结束条件
printf("%d",count);
}
}
}
return 0;
}
运行结果是:8879
此题思路为自己理解,如有错误欢迎评论区指正!如果有更好的解法,留在评论区,共同学习!