
由于是月历,所以,算法采用每月的第一天是星期几的思路确定1号的位置,然后顺延下来,计算星期的方法采用蔡勒公式。
然后,比较重要的一点:罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。 所以只能计算1582年之后的月历。
[c]#include<stdio.h>
int Zeller(int y,int m);
int run(int n);
void main()
{
int year,month,i,j,k,n=1,day;
printf("欢迎使用万年历查询工具。\n");
printf("请输入要查询的年份(本程序只支持公元后纪年):\n");
scanf("%d",&year);
printf("请输入月份:\n");
scanf("%d",&month);
i=Zeller(year,month);
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day=31;break;
case 4:
case 6:
case 9:
case 11:
day=30;break;
case 2:day=run(year);
}
printf(" S M T W T F S\n");
for(j=0;j<=5;j++)
{
for(k=0;k<=6;k++)
{
if((j==0)&&(j*4+k)<i)
printf(" ");
else
if(n<=day)
{
printf("%3d",n);
n++;
}
}
printf("\n");
}
}
int Zeller(int y,int m)
{
int w,c,d;
c=y/100;
d=y-c*100;
if(m<=2)
{
d-=1;
m+=12;
}
w=d+d/4+c/4-2*c+26*(m+1)/10;
while(w<0)
{
w+=7;
}
return w%7;
}
int run(int n)
{
if(n%100==0)
{
if(n%400==0)
return 29;
else
return 28;
}
else
{
if(n%4==0)
return 29;
else
return 28;
}
}[/c]