对于蓝桥杯关于计算日期有关的题目解析(c语言)

对于蓝桥杯关于计算日期有关的题目解析
本期我将以2020年第十一届蓝桥杯第四题为例

题目:

小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020
年10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

第一步:

计算总日期
简单有效的方法可以采取excel
用DAY函数算尺两者相差的天数
对于蓝桥杯关于计算日期有关的题目解析(c语言)_第1张图片输入格式为上
对于蓝桥杯关于计算日期有关的题目解析(c语言)_第2张图片
在插入函数中选择DAY函数即可算出相差天数,这里相差为7579(但是题目说含(第一天和最后一天,要再加上1天,结果为7580)

第二步

计算有几个周一:
从2000年1月1日开始(周六)
到2020年10月1日结束(周四)
用for循环即可
for(int i=3;i<+7580;I+=7) { ans++; }
结果为1083个周一

第三步

计算有几个月初
20年间总共20*12=240月
再加上10个月
总共250个月

第四步

计算月初与周一重合的天数
2000年1月1日是从周六开始,所以总天数(sum-2)就是第一个星期一
(sum-2)%7就是周一和月初的重合日

#include
	int a[13] = { 0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int  sum=0,s;
	int main()
	{
	for (int i = 2000; i < 2020; i++)
	{
		
		if (((0 == i% 4) && (0 != i % 100)) || (0 == i % 400))
		{
			a[2]++;
		}

		for (int j = 1; j <= 12; j++)
		{
			sum += a[j];
			if ((sum-2)%7==0)
			{
				s++;
			}
			
		}
		a[2] = 28;
	}
	a[2] = 29;
	for (int j = 1; j <= 9; j++)
	{
		sum += a[j];
		if ((sum - 2) % 7 == 0)
		{
			s++;
		}
	}
	sum += 1;
	if ((sum - 2) % 7 == 0)
	{
		s++;
	}
	printf("%d",s);
	return 0;




}
结果为34个

第5步

计算总和
结果8879

拓展部分

可用蔡勒公式计算某一天为星期几
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
(或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1)
若要计算的日期是在1582年10月4日或之前,公式则为 
 w=y+[y/4]+[c/4]-2c+[13(m+1)/5]+d+2
以1572年9月3日为界:
1572年9月3日后:w = (d + 2m+3(m+1)/5+y+y/4-y/100+y/400)%7;
1572年9月3日前:w = (d+2m+3(m+1)/5+y+y/4+5) % 7;
折叠编辑本段符号意义
  w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪减1(年份前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。

你可能感兴趣的:(算法,日期计算,算法)