What day is it
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3865 Accepted Submission(s): 1123
Problem Description
Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me what day it is ?
Input
There are multiply cases.
One line is one case.
There are three integers, year(0<year<10000), month(0<=month<13), day(0<=day<32).
Output
Output one line.
if the date is illegal, you should output "illegal". Or, you should output what day it is.
Sample Input
2007 11 17
Sample Output
Saturday
Author
LGX
Source
HDU 2007-11 Programming Contest_WarmUp
题目意思很简单,给你一个日期,让你输出是星期几。。这题其实非常的蛋疼。。我写了好长。。主要思想就是求出总天数,用总天数%7。得到相应的星期几。
下面附上代码带详细解析、代码如下。。
#include <stdio.h> #include<string.h> void solve() { char str[7][12]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}; //用一个二维数组存放星期几。 int y,m,d,i; while(~scanf("%d%d%d",&y,&m,&d)) //输入y,m,d。分别代表年月日。 { if(y<=0 ) { printf("illegal\n"); // 如果年份小于0,则不合法。 continue; } __int64 sum=0; __int64 sum1=0; for(i=1;i<y;i++) { if((i%4==0 && i%100!=0) ||i%400==0)// 找出1到(Y-1)年时一共有几个闰年。比如Y==2007,求的是1到2006有几个闰年。 sum1++; } sum+=(y-1-sum1)*365;// 计算1到2006非闰年的总天数。 sum+=sum1*366;// 计算1到2007闰年总天数 ,Y年(2007年)这年单独算 if((y%4==0 &&y%100!=0) ||y%400==0)// 如果这年是闰年的话 { if(m==2 &&d>29) //2月份单独讨论。 { printf("illegal\n");// 2月29不合法。 continue; } if(((m==1 || m==3 || m==5 ||m==7 || m==8 ||m==10 || m==12) &&d>31) || ((m==4 || m==6 ||m==9 ||m==11)&&d>30 ))//找出月份为30天的,大于30不合法,31天的,大于31不合法 { printf("illegal\n"); continue; } if(m>12 ||m <=0) { printf("illegal\n");//月份大于12 或者等于0不合法 continue; } if(m==0 ||d==0)// 月份等于0或者天数等于0不合法。 { printf("illegal\n"); continue; } if(m==1) sum+=d; if(m==2) sum+=31+d; if(m==3) sum+=31+d+29; if(m==4) sum+=31+d+29+31; if(m==5) sum+=31+d+29+31+30; if(m==6) sum+=31+d+29+31+30+31; if(m==7) sum+=31+d+29+31+30+31+30; if(m==8) sum+=31+d+29+31+30+31+30+31; if(m==9) sum+=31+d+29+31+30+31+30+31+31; if(m==10) sum+=31+d+29+31+30+31+30+31+31+30; if(m==11) sum+=31+d+29+31+30+31+30+31+31+30+31; if(m==12) sum+=31+d+29+31+30+31+30+31+31+30+31+30;//以上主要是算Y年这年的总天数。 } else //以下是非闰年的情况 将所有的29改成28就好 { if(m==2 &&d>28) { printf("illegal\n"); continue; } if(((m==1 || m==3 || m==5 ||m==7 || m==8 ||m==10 || m==12) &&d>31)|| ((m==4 || m==6 ||m==9 ||m==11)&&d>30 )) { printf("illegal\n"); continue; } if(m>12 ||m <=0) { printf("illegal\n"); continue; } if(m==0 ||d==0) { printf("illegal\n"); continue; }//以上同上 if(m==1) sum+=d; if(m==2) sum+=31+d; if(m==3) sum+=31+d+28; if(m==4) sum+=31+d+28+31; if(m==5) sum+=31+d+28+31+30; if(m==6) sum+=31+d+28+31+30+31; if(m==7) sum+=31+d+28+31+30+31+30; if(m==8) sum+=31+d+28+31+30+31+30+31; if(m==9) sum+=31+d+28+31+30+31+30+31+31; if(m==10) sum+=31+d+28+31+30+31+30+31+31+30; if(m==11) sum+=31+d+28+31+30+31+30+31+31+30+31; if(m==12) sum+=31+d+28+31+30+31+30+31+31+30+31+30;//2月变成28天。 } if(sum%7==1) //sum就是总天数了。一年一月一号是星期一。所以只要用总天数%7就能得到相应的星期几。 printf("%s\n",str[0]); if(sum%7==2) printf("%s\n",str[1]); if(sum%7==3) printf("%s\n",str[2]); if(sum%7==4) printf("%s\n",str[3]); if(sum%7==5) printf("%s\n",str[4]); if(sum%7==6) printf("%s\n",str[5]); if(!(sum%7)) printf("%s\n",str[6]); }// 问题得解 } int main() { solve(); //解决问题。 return 0; }
时间: 2024-12-22 20:05:57