第四题:跑步锻炼
题目描述
小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?
题目分析
首先算出总的天数,和月份数,然后求出一共有多少个周一,和周一中为月份的天数
最后总天数+周一天数+月初天数 - 周一和月初重合天数
题目代码
#include<stdio.h>
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//先定义一个存储12个月分别天数的数组 ,开始 0是方便使用而定义的
//如从 1月几号,就是 0+当前天数;
int is_leap(int year)//判断是否为闰年,若是返回1+28,否 返回0+28;
{
if(year%400==0||year%4==0&&year%100!=0)
return 1;
else return 0;
}
int get_day(int year,int month)//前面输入 具体年份,后面输入具体月份,
//返回结果是x年x月对应 天数
{
if(month==2) return 28+is_leap(year);
return days[month];
}
int main()//3个for循环,第一个从年开始遍历
//第二个从月份开始遍历
//第三个从天数开始遍历
{
int sum=0,ans=0;
for(int i=2000;i<=2019;i++)//从2000年1月份到第2019年第12月份
{
for(int j=1;j<=12;j++)
{
for(int k=1;k<=get_day(i,j);k++)
//当遍历条件判断符合是该月第一天或者是星期一,则跑2千米
{
int weekday=(sum+5)%7;
//这个(sum+5) %7设计得很巧妙,是根据2000年1月1日是星期六得出来的
//相当于从星期一开始,每过7天就一循环,星期六=星期一+5天
//它可以通过(加某个数求余)具体判断出是星期几
//(仔细思考星期一到本周星期六,相差5天)
if(k==1||weekday==0)
{
ans=ans+2;//若符合条件,跑2千米
}
else {ans++;}
sum++;//每次累加总天数
}
}
}
for(int j=1;j<=9;j++)//这里程序大致和上面步骤相同,只不过是从2020年的1月份到9月份
{
for(int k=1;k<=get_day(2020,j);k++)
{
int weekday=(sum+5)%7;
if(k==1||weekday==0)
{
ans=ans+2;
}
else ans++;
sum++;
}
}
printf("总天数:%d\n 共计%d千米",sum,ans+2);//2020年10月1 并未计算,这里给它加2
}