已知1998年的1月1日是星期4,写一个函数,输入参数为年月日,返回值范围1~7,代表该天是星期几。
建一个VS2010 cpp console工程,验证结果正确,附核心代码如下:
const int MonthDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int testrunnian(int iyear)// 检测闰年
{
if(iyear%400 == 0|| (iyear%4 == 0 && iyear%100 != 0))
return 1;
else
return 0;
}
int thisyear_1_1(int iyear)//计算这一年的1月1日是周几
// 19980101是周四
{
int ndays;
int nRunnian=0;
if(iyear > 1998)
{
for(int i=1998;i<iyear;i++)
nRunnian+=testrunnian(i);
ndays = 365*(iyear - 1998)+nRunnian;
return (4+ndays)%7;
}
else if(iyear < 1998)
{
for(int i=iyear; i<1998;i++)
nRunnian+=testrunnian(i);
ndays = (4-365*(1998-iyear)-nRunnian)%7;
if(ndays<0)
ndays+=7;
return ndays;
}
else return 4;
}
int weekday(int iyear, int imonth, int iday)
//计算星期
{
int base = thisyear_1_1(iyear);// 基准
int ndays =0;
for(int i=1;i<imonth;i++)
{
ndays+=MonthDay[i];
}
if(imonth>2)
ndays+=testrunnian(iyear);
ndays+=iday;
return (base+(ndays-1)%7)%7==0 ? 7:(base+(ndays-1)%7)%7;
}
int main(void)
{
printf("%d\n",weekday(2012,9,25));
printf("%d\n",weekday(1901,3,1));
printf("%d\n",weekday(2049,12,31));
while(1);
return 0;
}