合法日期

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte

描述


知道日期的来历吗。我们通常以公元纪年,如公元2009年。这种国际通行的纪年体系以传说中耶稣基督的生年为公历元年(相当于中国西汉平帝元年)。一年包括12个月,每个月的天数不全相同。
星期的起源应该是连系著月亮的周期,因为七天大约是月亮一周的四份之一。Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday依次表示星期日、星期一、星期二、星期三、星期四、星期五、星期六。
给定一个日期,判断是否合法。
输入


第一行是一个正整数:测试用例数目,最多为100。之后,每个测试用例包括:
l       1行:给三个整数y、m、d和一个字符串w
输出


对于每个测试用例:
l       输出YES或NO,y、m、d、w是否构成一个合法的日期。
 
样例输入

2
2009 5 29 Monday
2009 5 30 Saturday

样例输出

NO
YES


我的代码如下:
#include <stdio.h>
#include <string.h>
int is_legal1(int y,int m,int d);
int is_legal2(int y,int m,int d,char w[]);
int main()
{
    int n,i=0,y,m,d;
    char w[10];
    scanf("%d",&n);
    while (i<n)
    {
        scanf("%d%d%d",&y,&m,&d);
        getchar();
        gets(w);
        if (is_legal1(y,m,d)&&is_legal2(y,m,d,w)==0&&y>0)
        {printf("Yes\n");
        }
        else printf("No\n");
        i++;
    }

}
int is_legal1(int y,int m,int d)
{
    if ((y%4==0)&&(y%100!=0)||(y%400)==0 )
    {
        switch (m)
        {
        case 1:if (d>=0&&d<=31) return 1;
               else return 0;break;
        case 2:if (d>=0&&d<=29) return 1;
               else return 0;break;
        case 3:if (d>=0&&d<=31) return 1;
               else return 0;break;
        case 4:if (d>=0&&d<=30) return 1;
               else return 0;break;
        case 5:if (d>=0&&d<=31) return 1;
               else return 0;break;
        case 6:if (d>=0&&d<=30) return 1;
               else return 0;break;
        case 7:if (d>=0&&d<=31) return 1;
               else return 0;break;
        case 8:if (d>=0&&d<=31) return 1;
               else return 0;break;
        case 9:if (d>=0&&d<=30) return 1;
               else return 0;break;
        case 10:if (d>=0&&d<=31) return 1;
               else return 0;break;
        case 11:if (d>=0&&d<=30) return 1;
               else return 0;break;
        case 12:if (d>=0&&d<=31) return 1;
               else return 0;break;
                }
    }
    else
    {
        switch (m)
        {
        case 1:if (d>=0&&d<=31) return 1;
            else return 0;break;
        case 2:if (d>=0&&d<=28) return 1;
            else return 0;break;
        case 3:if (d>=0&&d<=31) return 1;
            else return 0;break;
        case 4:if (d>=0&&d<=30) return 1;
            else return 0;break;
        case 5:if (d>=0&&d<=31) return 1;
            else return 0;break;
        case 6:if (d>=0&&d<=30) return 1;
            else return 0;break;
        case 7:if (d>=0&&d<=31) return 1;
            else return 0;break;
        case 8:if (d>=0&&d<=31) return 1;
            else return 0;break;
        case 9:if (d>=0&&d<=30) return 1;
            else return 0;break;
        case 10:if (d>=0&&d<=31) return 1;
            else return 0;break;
        case 11:if (d>=0&&d<=30) return 1;
            else return 0;break;
        case 12:if (d>=0&&d<=31) return 1;
               else return 0;break;
        }
    }
}
int is_legal2(int y,int m,int d,char w[])
{
        char str[10];
        int r,iWeek;
        if(m==1||m==2)
        {
            m+=12;
            y--;
        }
        iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
        switch(iWeek)
        {
        case 0: strcpy(str,"Monday");break;
        case 1: strcpy(str,"Tuesday");break;
        case 2: strcpy(str,"Wednesday");break;
        case 3: strcpy(str,"Thursday");break;
        case 4: strcpy(str,"Friday");break;
        case 5: strcpy(str,"Saturday");break;
        case 6: strcpy(str,"Sunday");break;
        }
        r=strcmp(str,w);
        return r;    
}

学校出的题目,我刚初学,一直都是WRONG ANSWER,无法ACCEPT,请高手看看错在哪,谢谢啊