一、蔡勒公式
1、1582年10月4日之后:w=y1+(y1/4)+(c/4)-2*c+(26*(m+1)/10)+d-1;
1582年10月4日以及之前:w=y1+y/4+c/4-2*c+13*(m+1)/5+d+2;
输出:(w%7+7)%7 (为了确保结果为正数)
说明: w为星期, 0-星期日,1-星期一,..........6-星期六
c为年份的前两位 y为年份的后两位 d为日 m为月
(m大于等于3,小于等于14,即在蔡勒公式中,某年的1,2月份要看作上一年的13,14月份来计算,如:2003年1月1日看作2002年13月1日来计算)
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int y,c,m,d,w;
int main()
{
while(~scanf("%d%d%d",&y,&m,&d))
{
if(m==1||m==2) m+=12,y=y-1;
w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;//此为其他公式,直接输出w即可
// int y1=y%10+((y/10)%10)*10;
// c=(y/100)%10+((y/1000)%10)*10;
// w=y1+(y1/4)+(c/4)-2*c+(26*(m+1)/10)+d-1;
printf("%d\n",(w%7+7)%7);
}
return 0;
}
二、其他公式
w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 y为四位数,其他与上面同
(直接输出w就行代码在上面) 建议用这个,代码较短
例题:HDU -6113 今夕何夕
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=6112
今夕何夕Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3332 Accepted Submission(s): 1064 Problem Description 今天是2017年8月6日,农历闰六月十五。
Input 第一行为T,表示输入数据组数。
Output 对每组数据输出答案年份,题目保证答案不会超过四位数。
Sample Input 3 2017-08-06 2017-08-07 2018-01-01
Sample Output 2023 2023 2024
|
AC代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int y,m,d,w,t;
int judge(int y)
{
if(y%4==0&&y%100!=0||y%400==0)
return 1;
else return 0;
}
int week(int y,int m,int d)
{
if(m==1||m==2) m+=12,y=y-1;
return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d-%d-%d",&y,&m,&d);
w=week(y,m,d);
for(int i=y+1;i<=10000;i++)
{
if(judge(y)==1&&m==2&&d==29&&judge(i)==0)
continue;
if(week(i,m,d)==w)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}