题目描述
今天是2007年11月17日,星期六。现在如果我告诉你一个日期,你能告诉它是星期几吗?
输入
输入有多组测试数据,每个测试数据占一行。每行有3个整数,分别表示:年(0< year < 10000), 月(0 <= month < 13), 日(0 <= day < 32)。
输出
每个测试数据输出一行,如果输入数据不对,输出“illegal”,否则输出它是星期几。
样例输入 复制
2007 11 17
样例输出 复制
Saturday
我觉得写这道题的我非常的愚蠢,先来看看写了半个小时的破破烂烂没写完的代码
#include<stdio.h>
//闰年判断
int rn(int year)
{
int flag=0;
if(year%4==0||year%100==0&&year%400!=0)
flag=1;
return flag;
}
//2007年 11月 17日 周六 计算输入日期和这天差多少天
int main()
{
int year,month,day;
int r;
int daysum;
char week[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
int mon[2][13]={"0,31,28,31,30,31,30,31,31,30,31,30,31","0,31,29,31,30,31,30,31,31,30,31,30,31"};
while(scanf("%4d %02d %02d",&year,&month,&day)!=EOF)
{
daysum=0;
r=rn(year);
if(month==0||day==0)
{
printf("illegal\n");
}
if(r)
{
if(month==2&&day>28)
printf("illegal\n");
}
//计算月日差多少
int t =11>month?11:month;
for(int i=11<month?11:month;i<t;i++)
{
}
int c=year-2007;
if(year>2007){
if(c%4>1)
{
daysum=365*(c-1)+366*(c/4)+cc;
}
}
}
}
通过以上代码 可以看到码这道题的人 非常愚蠢,和不懂得变通,这道题,我们完全可以通过已知的日期,把公元元年1月1日是周几换算出来,然后直接计算输入的日期与初始日差的天数即可。
#include <stdio.h>
char date[7][10]={"Sunday","Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//判断年份是否为闰年
int isLeap(int year)
{
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
return 0;
}
int main()
{
int year,month,day;
int year1[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int year2[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
while(scanf("%d %d %d", &year,&month,&day) != EOF)
{
int days = 0, k = 0, j = 0;
if(month == 2)
{
if(isLeap(year))
{
if(day > year2[month])
{
printf("illegal\n");
continue;
}
}
else
{
if(day > year1[month])
{
printf("illegal\n");
continue;
}
}
}
//现在的日期与公元第一天开始相隔的天数
for(k = 1;k < year;k++)
{
if(isLeap(k))
days = days + 366;
else
days = days + 365;
}
for(j = 0; j < month; j++)
{
if(isLeap(year))
days = days + year2[j];
else
days = days + year1[j];
}
days = days + day;
printf("%s\n", date[days % 7]);
}
}