What day is it(1246)

输入:year(0<year<10000), month(0<=month<13), day(0<=day<32).

计算输入的日子是星期几,如果输入不合法则输出illegal

输出:what day it is.


闰年是能被4整除且不能被100整除或者能被400整除的。闰年的2月是29天,平年的二月是28天。

解:先判断不合法的情况,然后计算星期,闰年400年是一个大循环,星期恰好也是循环(开始是周一),仔细计算出day然后对7取余。

#include<stdio.h>
int main()
{
int day,y,m,d,flag1,flag2;
while(scanf("%d%d%d",&y,&m,&d)!=EOF)
{
flag1=0;flag2=0;
y%=400;
if(y==0)
{
y=400;
flag2=1;
}
else if(y%4==0&&y%100!=0)
flag2=1;
if(m==4||m==6||m==9||m==11)
{
if(d>30)
flag1=1;
}
else if(m==2)
{
if(flag2)
{
if(d>29)
flag1=1;
}
else if(d>28)
flag1=1;
}
else
{
if(d>31)
flag1=1;
}
if(flag1||!d||!m)
{
printf("illegal\n");
continue;
}
day=(y-1+(y-1)/4-(y-1)/100)%7;
switch (m)
{
case 1:break;
case 2:day+=3;break;
case 3:day+=3;break;
case 4:day+=6;break;
case 5:day+=1;break;
case 6:day+=4;break;
case 7:day+=6;break;
case 8:day+=2;break;
case 9:day+=5;break;
case 10:day+=0;break;
case 11:day+=3;break;
case 12:day+=5;break;
}
if(flag2&&m>2)
{day++;}
switch ((day+d)%7)
{
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 0:printf("Sunday\n");break;
}
}
return 0;
}

这个太麻烦了,可以用蔡勒(Zeller)公式计算星期

c=y/100;  //c代表世纪
y=y-c*100;
week=(c/4)-2*c+(y+y/4)+(13*(m+1)/5)+d-1;
while(week<0)
   week+=7;

输出也可以简化

char w[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

……

printf("%s\n",w[week%7]);

判断合法也可以写得很短。。。全简化之后就变得很简单了




猜你喜欢

转载自blog.csdn.net/huadu_bjfu/article/details/42927311