这题就是一道很常见的算星期的题目,给你年月日,求改天星期几
不过这题和某渣平时碰到的有点不一样,平时的算星期,可以采用蔡勒公式直接求解
蔡勒公式详情见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;
}