已知年月日求星期:
公式: s= y-1 + (y-1)/4 – (y-1)/100 + (y-1)/400 +c;
C为该年一月一日至当日的天数
S%7
求出s,将s除以7取余即为当日的星期数,0为星期日,1为星期1,以此类推。
题目
【问题描述】
双十一购物狂欢节,是指每年11月11日的网络促销日,源于淘宝商城(天猫)2009年11月11日举办的网络促销活动。2019年11月11日刚好是星期一,是工作日,为了不影响双11的交易额,阿里巴巴公司特意加大了促销力度,并有红包大奖。因此,对买家来说,今年的双11是幸运日。
阿里巴巴有意打造成百年老店。因此,买家想知道,从第x年到第y年(含第x年但不含第y年),到底有多少个幸运双11(11月11日刚好是星期一)。
【输入形式】
输入文件包含多个测试数据,每个测试数据为两个整数x和y,代表两个年份,x和y的范围都在[2009, 5000],且x<y。输入文件最后一行为两个0,代表输入结束。
【输出形式】
对每个测试数据,输出占一行,为一个整数,表示从第x年到第y年(含第x年但不含第y年),到底有多少个(可能为0)幸运双11。
【样例输入】
2009 2012
2009 2020
2009 5000
0 0
【样例输出】
0
2
426
【样例说明】
【评分标准】
代码
#include<iostream>
using namespace std;
bool isRun(int year)
{
if(year%400==0 || (year%4 ==0 && year%100 !=0))
return true;
return false;
}
int days(int y,int m,int d)
{
int sum=0;
for(int i=1;i<m;i++)
{
switch(i)
{
case 1:
sum+=31;
break;
case 2:
if(isRun(y))
sum+=29;
else
sum+=28;
break;
case 3:
sum+=31;
break;
case 4:
sum+=30;
break;
case 5:
sum+=31;
break;
case 6:
sum+=30;
break;
case 7:
sum+=31;
break;
case 8:
sum+=31;
break;
case 9:
sum+=30;
break;
case 10:
sum+=31;
break;
case 11:
sum+=30;
break;
case 12:
sum+=31;
break;
default: break;
}
}
sum+=d;
return sum;
}
int main()
{
int y1,y2;
cin>>y1>>y2;
while(y1 !=0 && y2!=0)
{
int sum=0;
for(int i=y1;i<y2;i++)
{
if((i-1+(i-1)/4-(i-1)/100+(i-1)/400+days(i,11,11))%7 == 1)
sum++;
}
cout<<sum<<endl;
cin>>y1>>y2;
}
}