这道题与2018年第九届蓝桥杯c/c++A组的星期一类似,但在细节上这道题要麻烦点。(详情可见我的另一篇博文:2018年第九届蓝桥杯c/c++A组的星期一)
言归正传,我们开始分析这道题目。
(1)每天跑1千米。
(2)周一或者月初(1号)跑2千米。
(3)2000年1月1号周六到2020年10月1号周四,这一段时间总共跑了多少千米。
明确问题后我们该如何设计算法使得电脑能像我们一样去统计出周一或者月初的天数并去计算总共的公里数呢?
我们会从2000年的1月1日(周六)开始数,数完1月数2月,数完2000年数2001年,直到2020年10月1日(周四)。但是不同的年份有时候会分闰年和平年,而且闰年和平年的2月份是不同的。因此我们需要设计一个算法帮助计算机去识别不同的年份,从而确定月份里的天数。
因此我们可以得到如下的代码:
int monthes[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
for(year=2000; year<2020; year++)//计算每一年的公里数
{//2020年不完整需要单独计算,条件计算到2019年
if((year%4==0&&year%100!=0)||year%400==0)
{
monthes[2]=29;
}
else
{
monthes[2]=28;
}
for(month=1; month<=12; month++)
{
for(day=1; day<=monthes[month]; day++)
{//遍历每一个月份
count_km++;
if(day==1)
{
count_km++;
}
}
}
}
但是仔细看完会发现周一的情况呢?
因此我们需要再设定一个关于辨别周一的标记,去告诉计算机到周一了!
1、2、3、4、5、6、7分别对应着星期一到星期日,当我们从一数到七的时候,我们就会知道这一周过完了要开始下一周了,但是计算机不知道!所以我们需要设定一个值告诉计算机数完了要开始重新数,这样就可以实现在计算机上统计周一的情况。
题目的开始日期对应周六,那么设定week_start=6;当week_start=8时,令week_start=1;然后再开始数:week_start++;
week_start=6;
if(week_start==8)
{
week_start=1;
}
week_start++;
完整代码:
#include<stdio.h>
int main()
{
//每天跑1000米
//周一或者月初(1号)跑2000米
//2000年1月1号周六到2020年10月1号周四,这一段时间总共跑了多少千米。
//首先设置一个月份数组
//为了适应平时的逻辑习惯,月份数组设置13个数,第一个数随便设定
int monthes[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int year;//年份标记
int count_km=0;//公里数
int month;//月份标记
int day;//日期标记
int week_start=6;//从周六开始
for(year=2000; year<2020; year++)//计算每一年的公里数
{//2020年不完整需要单独计算,条件计算到2019年
if((year%4==0&&year%100!=0)||year%400==0)
{
monthes[2]=29;
}
else
{
monthes[2]=28;
}
for(month=1; month<=12; month++)
{
for(day=1; day<=monthes[month]; day++)
{//遍历每一个月份
count_km++;
if(week_start==8)
{//新的一周的标记
week_start=1;
}
if(day==1||week_start==1)
{//每个月的月初或周一会跑2千米,即在原有基础上多跑1千米
count_km++;
}
week_start++;
}
}
}
for(month=1; month<=9; month++)
{
//2020年是闰年,2月份为29天,不加上要出错会沿用2019年的月份天数得到错误的答案
int monthes[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
for(day=1; day<=monthes[month]; day++)
{//遍历每一个月份
count_km++;
if(week_start==8)
{//新的一周的标记
week_start=1;
}
if(day==1||week_start==1)
{//每个月的月初或周一
count_km++;
}
week_start++;
}
}
count_km+=2;//加上10月1日
printf("总共跑步%d千米",count_km);
}
答案:8879