hdu 1308 What Day Is It? (算星期几)

来源:互联网 发布:房地产中介网站源码 编辑:程序博客网 时间:2024/05/22 19:16

这题就是一道很常见的算星期的题目,给你年月日,求改天星期几

不过这题和某渣平时碰到的有点不一样,平时的算星期,可以采用蔡勒公式直接求解

蔡勒公式详情见http://baike.baidu.com/link?url=k75Ks72KBxf-rZq5nubcDwsXogkBE1-8ALWCq_Ew1b_B8rNk9gIsyUbHFxiMBHoh 

这题有两个特殊条件:

条件一: 1528年之前 闰年的规则为%4==0 即可,1528年之后  闰年的规则为 (n%4==0&&n%100) || n%400==0

条件二:  1752年9月2日到  1752年9月14日之间的11天是不存在的, 即1752年9月2日为星期三  1752年9月14日为星期四

方法:

先判断该天是否合法,然后:

不考虑消失11天, 若该天在1752年9月2日 之前, 则用 1年1月1日 (星期日)为参考点去计算

否则则用 1752年9月14日为星期四 为参考点去计算, 计算日子的总和时加一个特判,把1528之前的年的天数和1528年之后的年的天数分开判断

 

代码:

#include<stdio.h>#include<math.h>#include<string.h>#include<algorithm>#include<limits.h>using namespace std;int pd1(int y,int m,int d){int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if((y<=1582) && (y%4) )a[2]++;else if((y> 1582) &&  (y%4== 0 && y%100) || (y%400== 0) )a[2]++;if(d> 0 && d<= a[m]){int sum= 0;for(int i= 1; i< y; i++){if(i<= 1582){if(i%4==0){sum+= 366;}elsesum+= 365;}else{if( (i%4== 0 && i%100) || (i%400== 0) )sum+= 366;elsesum+= 365;}}for(int i= 1; i< m; i++)sum+= a[i];sum+= d;return sum;}return 0;}int main(){char b[7][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};char c[13][20] ={"0","January","February","March","April","May","June","July","August","September","0ctober","November","December"};int y,m,d;while(scanf("%d%d%d",&m,&d,&y)!=EOF&& y+ m +d){int sum= pd1(y,m,d);//printf("%d\n",sum);if(!sum){printf("%d/%d/%d is an invalid date.\n",m,d,y);continue;}int flag= 0;if(y>1752){flag= 1;}else if(y==1752){if(m > 9)flag= 1;else if(m==9){if(d>= 14)flag= 1;}}//判断改天是在星期修改前还是修改后if(flag==0){// 1年1月1日为星期日 int w= (sum -1)% 7;printf("%s %d, %d is a %s\n",c[m],d,y,b[w]);}else{//当日子为 1752年9月14日时,函数返回639809天,此时为星期四 int w= (sum- 639805) % 7;printf("%s %d, %d is a %s\n",c[m],d,y,b[w]); } }return 0;}


 

 

0 0