算法题每日一练---第13天:跑步锻炼

639 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

一、问题描述

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。

小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

二、题目要求

考察

1.日期判断,数学思想
2.建议用时10~20min

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

三、问题分析

这道题和算法题每日一练---第5天:星系炸弹总体的思想差不多,多了一个限制条件。就是再编写代码的时候要对于月初和星期一的情况需要特殊处理判断,当这一天不是月初、不是星期一的情况,跑步天数只是增加一天。否则,跑步天数增加两天。

核心算法如下:

if(q!=1&&d!=1)//q代表星期几,d代表第几天
{
    sum+=1;//sum代表跑步天数,跑步天数加一
}
else
    sum+=2;//否则,跑步天数加二

四、编码实现

#include<iostream>
using namespace std;
long long int sum=0;//额外定义sum值 
int main()
{
	int i,y=2000,m=1,d=1,q=6;//初始化定义年份、月份、天数 
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//12个月份的天数 
	while(1)
	{
		if(y==2020&&m==10&&d==1)//时间到了规定日期 
		{
			cout<<sum+2;//输出结果 
			exit(0);//退出程序 
		}
		d++;//天数加一 
		q++;//日期数加一 
		if(y%400==0||y%4==0&&y%100!=0)//满足闰年的要求 
			a[2]=29;//天数变成29 
		else
			a[2]=28;//天数变成28 
		if(d>a[m])//天数大于当前月份 
		{
			d=1;//天数变为1 
			m++;//月份++ 
		}
		if(m>12)//月份大于12 
		{
			m=1;//月份变为1 
			y++;//年份++ 
		}
		if(q>7)//星期大于7 
		{
			q=1;//变为星期一 
		}
		if(q!=1&&d!=1)//不为星期一并且不为月份第一 
		{
			sum+=1;
		}
		else
			sum+=2;
		
	}
	return 0;
}

五、输出结果

输出结果为:8879

1.png