每日刷题(九十七)
蓝桥杯第十一届C语言B组省赛习题D:跑步锻炼(10’)
思路:
首先设一个月份的数组,用来记录每个月的天数,然后考虑闰年平年对二月天数的影响。
因为题目问的是多少千米,那么普通天数1就相当于1千米,总和公式为:
2000.1.1~2020.10.1总天数 + 2000.1.1~2020.10.1中是月初但不是周一的天数 + 2000.1.1~2020.10.1中周一的天数
总天数很容易算,那么月初但不是周一的天数如何考虑呢?我们只要设一个判断条件if((截至目前的总天数 + 6) % 7 != 1)
有朋友就要问了,为什么是+6呢?
因为他说了2000.1.1是周六,就相当于原数从Sun开始整体向右移了六个单位,这样是不是更好理解了
接下来就是算周一的天数,我们不妨画个图
以上橙线包裹的是2000.1,我们不妨就针对2000.1,如何将它补齐整除7?那当然是减2加6,因此(sum - 2 + 6) / 7就是这么来的
详细C++代码:
#include<iostream>
using namespace std;
int sum = 0, s = 0;
int month[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
for(int i = 2000; i < 2020; i++)
{
if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
{
month[2]++; //闰年
}
for(int i = 1; i <= 12;i++)
{
if((sum + 6) % 7 != 1)
{
s++; //计算是月初且不是周一的日子
}
sum += month[i];
}
if(month[2] == 29)
{
month[2]--;
}
}
month[2]++;
//2020年的前9个月
for(int i = 1; i <= 9; i++)
{
if((sum + 6) % 7 != 1)
{
s++; //计算是月初且不是周一的日子
}
sum += month[i];
}
//加上2020.10.1日
sum += 1;
s++;
int z = sum + s + (sum - 2 + 6) / 7;
cout << z << endl;
return 0;
}
运行结果:
所以答案是8879