【问题描述】
已知1980年1月1日是星期二 ,任意输入一个日期,求这一天是星期几。
从键盘输入一行字符串Y-M-D,是一个有效的公历日期,其中Y为年,M为月,D为天,都不带有前缀0。
输出只有一行,是代表该日星期的字符串,对于星期一至星期日,分别输出Monday、Tuesday,Wednesday、Thursday、Fhiday、Saturday、Sunday,在行未要的出一个回车符。
#include<iostream>
using namespace std;
int main()
{
int a=0;
int i,y,m,d;
int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};
cin>>y>>m>>d;
for(i=1980;i<y;i++)
{
if((i%4==0 && i%100!=0) || i%400==0)
{
a+= 2;
}
else
{
a++;
}
}
if((y%4==0 && y%100!=0) || y%400==0)
{
b[1]=29;
}
for(i=0;i<m;i++)
{
a+= b[i];
}
a=(a+d)%7;
switch(a)
{
case 0: cout<<"Monday";
break;
case 1: cout<<"Tuesday";
break;
case 2: cout<<"Wednesday";
break;
case 3: cout<<"Thursday";
break;
case 4: cout<<"Friday";
break;
case 5: cout<<"Saturday";
break;
case 6: cout<<"Sunday";
break;
}
}
【思路解析】
//补充下:判断闻年,年份能被4整除井且不能被100整除,或者能被四百整除。闰年就是2月有29天。
1.1980年1月1日是星期二,所以从1979年12月31日算为第0天,是星期一。1980,1月1日当作第一天。所以从第0天开始,经历到第七天或者第七的倍数(即取余为零)的天数时为星期一不变。如果所经历天数除以七,取余为一,则往后推一天就是星期二,以此类推。
2.因为从1980年1月1日开始,到y年m月d日。期间所经历的时间可以分为三部分。
第一部分: 是1980年1月1日——y-1年12月31日(y年1月1日前一天)的时间
因为期间一般每过一年是365天,就是除以7余数为1,所以每过一年就是同个日期往后推一个星期几。
但是闰年的时候就是366天,就是除以7余数为1,所以每过一年就是同个日期往后推两个星期几。
这样就不用算其中的总天数,把各年取余算推迟的总和。
第二部分: 是y年1月1日到m-1月底(m月1日前一天)
设置一个数组b,里面为各个月的天数,并设置二月初始值为28。然后判断y年是否为闰年,如果是闰年的话先把该数组中的二月赋值为29。然后用for循环从第一个月累积加到第m个月,求其中的总和。可以像第一部分取余,也可以先不取因为第二部分的天数不多。
第三部分:是m月1日-m月d日
直接取d就是他们之间的天数,可以像第一部分取余,也可以先不取因为第三部分的天数也不多。
3.最后就是把三部分加起来再除以7取余,然后用switch拿取余后结果判断是星期几即可