这题就是一道很常见的算星期的题目,给你年月日,求改天星期几
不过这题和某渣平时碰到的有点不一样,平时的算星期,可以采用蔡勒公式直接求解
蔡勒公式详情见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; } else sum+= 365; } else { if( (i%4== 0 && i%100) || (i%400== 0) ) sum+= 366; else sum+= 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; }