#include<stdio.h>
int IsLeapYear(int year)//判断该年是否为闰年
{
if( (year%4==0&&year%100!=0) || (year%400 ==0 ) )
{
return 366;
}
else 365;
}



int fun(int year)//用于计算每年第一天是星期几的公式的一部分
{
int sum=0;
if(year>2011)
{
while(year>2011)
{
year--;
if(year%4==0&&year%100!=0||year%400==0) sum+=2;
else sum+=1;
}
return (sum+6)%7;
}

while(year<2011)
{
if(year%4==0&&year%100!=0||year%400==0) sum-=2;
else sum-=1;
year++;
}
return 6+sum%7;


}



int Isfirstday(int y)//计算每年第一天是星期几
{
int w=fun(y);
if(w==0) return 7;
else return w;
}




int IsMonth(int y,int m)//计算每一个月有多少天
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)return 31;
if(m==4||m==6||m==9||m==11)return 30;
if(m==2)
{
if(IsLeapYear(y)==1)return 29;
else return 28;
}
}


int main()
{
int y,i,j,k; //y表示年份
//i,j,k用于控制循环次数
printf("你想看的年份:");
scanf("%d",&y);
printf("\n---------------------%d 年 年 历-------------------------\n",y);


int fd=Isfirstday(y); //fd表示每年第一天是星期几

int day1,day2,date1,date2; //day1表示在奇数月份中具体天数是几号
//date1表示在奇数月份中具体天数是星期几
//day2表示在偶数月份中具体天数是几号
//date2表示在偶数月份中具体天数是星期几
date1=fd; //一月份的第一天就是fd。



for(i=1;i<=6;i=i+1)
{
printf(" %d月 %d月 \n",2*i-1,2*i);
printf(" Sun Mon Tue Wed Thur Fri Sat Sun Mon Tue Wed Thur Fri Sat\n");

day1=day2=1;
date2=(date1+IsMonth(y,2*i-1))%7;

if(date1<=6){
for(j=0;j<date1;j++) //每个奇数月的第一天是星期几,就要空出几组空格组(排版问题)。
printf(" ");
}else if(date1==7){

}


while(day1<=IsMonth(y,2*i-1))
{
printf("%4d",day1); //打印出每一天具体是几号,对应在第一行的星期几。
day1++;
date1=(date1+1)%7; //打印完了,date1要更新

if(date1%7==0||day1>IsMonth(y,2*i-1))
{
if(date1%7==0) printf(" ");//奇数月的某一周输出完了,接下来打印偶数月对应的那一周的数字

else //奇数月与偶数月相隔4个空格
{
for(k=0;k<8-date1;k++)
printf(" ");
}




for(j=0;j<date2;j++) //每个偶数月的第一天是星期几,就要空出几组空格组(排版问题)。
printf(" ");

while(day2<=IsMonth(y,2*i))
{
printf("%4d",day2); //打印出每一天具体是几号,对应在第一行的星期几。
day2++;
date2=(date2+1)%7;
if(date2%7==0) //这一周打印完了,就退出打印偶数月的while循环,继续打印奇数月下一周的数字
{
break;
}
}
printf("\n");
}
}





if(day1>IsMonth(y,2*i-1)&&day2<=IsMonth(y,2*i))//当奇数月打印完,且偶数月还没打印完时,继续打印偶数月的
{
printf(" ");//32格
while((day2<=IsMonth(y,2*i)))
{
printf("%4d",day2);
day2++;
date2=(date2+1)%7;
if(date2%7==0)
printf("\n");
}
}
date1=date2; //上一个偶数月的date2加一以后(“加一”在while循环里已经有了)就是下个奇数月的date1
printf("\n\n");
}
}