第十一届蓝桥杯省赛B组—— 跑步锻炼
题目描述
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米
。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米
。如果同时是周一或月初,小蓝也是跑 2 千米
。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)
到 2020 年 10 月 1 日周四(含)
。请问这段时间小蓝总共跑步多少千米?
运行限制
最大运行时间:1s
最大运行内存: 128M
答案:8879!
总体思路
首先初始化年、月、日、星期。表示2000年1月1日星期六。循环里面判断是否已经到了2020年10月1日
,到了就退出循环,输出总公里数。
int res = 0;//总公里数
year = 2000, month = 1, day = 1, week = 6; // 初始化操作
if(year == 2020 && month == 10 && day == 2) break;
循环内先用check()函数判断是否为月初或是周一。
bool check()
{
if(day == 1 || week == 1) return true;
return false;
}
循环内更新总公里数
if(check()) res += 2;
else res ++ ;
最后利用update()函数去更新日期
step1:先将day
和week
都向前增1;
day ++ ; week ++ ;
step2(更新week
):看看week
是否超出7,如果超出7的话就将week
置1;
week = week % 8 ? week % 8 : 1;//week已更新
step3(判断该月份有几天):
大月份(31天):1,3,5,7,8,10,12
小月份(31天):4,6,9,11
闰年(2月有29天
),平年(2月有28天
)
注意:其中闰年又分为世纪闰年(year % 400 == 0
)和普通闰年(year % 4 == 0
);
int m = 31;
if(month == 2)
{
if(year % 4 == 0 || year % 400 == 0) m = 29; //世纪闰年和普通闰年都要加进去
else m = 28;
}
else if(month == 4 || month == 6 || month == 9 || month == 11) m = 30;
step4(更新天数):如果天数超出step3
所得出的该月最大天数,month
增1,day
置1;
if(day / (m + 1) != 0)//day已更新
{
month ++ ;
day = 1;
}
step5(更新月份):如果月份超出12,则year
增1,month
置1;
if(month / 13 != 0)//month已更新
{
year ++ ;
month = 1;
}
c++代码
#include <iostream>
using namespace std;
int year, month, day, week;
bool check()
{
if(day == 1 || week == 1) return true;
return false;
}
void update()
{
day ++ ;
week ++ ;
week = week % 8 ? week % 8 : 1;//week已更新
int m = 31;
if(month == 2)
{
if(year % 4 == 0 || year % 400 == 0) m = 29; //世纪闰年和普通闰年都要加进去
else m = 28;
}
else if(month == 4 || month == 6 || month == 9 || month == 11) m = 30;
if(day / (m + 1) != 0)//day已更新
{
month ++ ;
day = 1;
}
if(month / 13 != 0)//month已更新
{
year ++ ;
month = 1;
}
}
int main()
{
int res = 0;
year = 2000, month = 1, day = 1, week = 6; // 初始化操作
while(true)
{
if(year == 2020 && month == 10 && day == 2) break;
//true:2km,flase:1km;
if(check()) res += 2;
else res ++ ;
update();
}
printf("%d", res);
return 0;
}
Java代码
import java.util.*;
public class Main {
static int year = 2000, month = 1, day = 1, week = 6;
public static void main(String args[]) {
int res = 0;
while(true)
{
if(year == 2020 && month == 10 && day == 2) break;
//true:2km,flase:1km;
if(check()) res += 2;
else res ++ ;
update();
}
System.out.println(res);
}
static boolean check()
{
if(day == 1 || week == 1) return true;
return false;
}
static void update()
{
day ++ ;
week ++ ;
week = week % 8 != 0 ? week % 8 : 1;//week已更新
int m = 31;
if(month == 2)
{
if(year % 4 == 0 || year % 400 == 0) m = 29; //世纪闰年和普通闰年都要加进去
else m = 28;
}
else if(month == 4 || month == 6 || month == 9 || month == 11) m = 30;
if(day / (m + 1) != 0)//day已更新
{
month ++ ;
day = 1;
}
if(month / 13 != 0)//month已更新
{
year ++ ;
month = 1;
}
}
}