2007 11 17
Saturday
题目意思很简单,给你一个日期,让你输出是星期几。。这题其实非常的蛋疼。。我写了好长。。主要思想就是求出总天数,用总天数%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; }
原文地址:http://blog.csdn.net/sky_miange/article/details/42174685