使用了蔡勒公式(是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几):
(不过这个公式只能对于1582年10月4日之后的日子使用,这其中有一个有趣的小故事,感兴趣的读者可以百度一下)
#include<stdio.h>
using namespace std;
int year;
int search(int m,int d)//查询这一天是星期几的公式
{
int tmpy=year;
if(m<3)
{
tmpy-=1;
m+=12;
}
int c=tmpy/100;
int y=tmpy-100*c;
//w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
return (y+y/4+c/4-2*c+26*(m+1)/10+d-1+7*100)%7;
}
int check()
{
if(year%4==0&&year%100!=0||year%400==0) return 1;
else return 0;
}
signed main()
{
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("请输入要查询的年份:");
scanf("%d",&year);
printf("\n\n\n%8d年的日历为\n\n\n",year);
printf("=========================================================\n\n\n\n");
if(check) a[1]=29; //检查是不是闰年
for(int i=1;i<=4;i++) //按照季节 输出
{ //m1,m2,m3分别判断这三个月的星期
int m1=search((i-1)*3+1,1),m2=search((i-1)*3+2,1),m3=search((i-1)*3+3,1);
printf("%15d月%30d月%30d月\n",(i-1)*3+1,(i-1)*3+2,(i-1)*3+3);
printf("Sun Mon Tue Wed Thu Fri Sat ");
printf("Sun Mon Tue Wed Thu Fri Sat ");
printf("Sun Mon Tue Wed Thu Fri Sat \n");
int d1=1,d2=1,d3=1;
for(int j=1;j<=6;j++)//一个月最多显示六行
{
for(int k=0;k<m1;k++)
printf(" ");
for(;m1<7;m1++)
{
if(d1<=a[(i-1)*3+0]) printf("%-4d",d1++);
else printf(" ");
}
m1=0;
printf(" ");
for(int k=0;k<m2;k++)
printf(" ");
for(;m2<7;m2++)
{
if(d2<=a[(i-1)*3+1]) printf("%-4d",d2++);
else printf(" ");
}
m2=0;
printf(" ");
for(int k=0;k<m3;k++)
printf(" ");
for(;m3<7;m3++)
{
if(d3<=a[(i-1)*3+2]) printf("%-4d",d3++);
else printf(" ");
}
m3=0;
printf("\n");
}
}
}