主题:[讨论]一道简单的ACM题,请高手看下我这里哪里错了?
合法日期
时间限制(普通/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,请高手看看错在哪,谢谢啊
时间限制(普通/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,请高手看看错在哪,谢谢啊