#include<stdio.h>
#include<stdlib.h>
//判断是否是闰年
int leap(int year)
{
if(year%4==0&&year%100!=0) return 1;
else if(year%400==0) return 1;
else return 0;
}
//返回某年某月的天数
int monthdays(int year, int month)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return 31;
else if(leap(year)==1&&month==2) return 29;
else if(month==2) return 28;
else return 30;
}
//返回输入年份的前一年到1900年的天数,为了计算输入年份1月1日需要空几个格子,即星期几
int sumdays(year)
{
int sum=0, i, day;
for(i=1900; i<year; i++)
{
if(leap(i)) day = 366;
else day = 365;
sum = sum+day;
}
return sum;
}
int main()
{
char bk=' ';
int year, month=1, week, day=1, i, mod, initial;
printf("**********万年历**********\n\n");
printf("请输入年份(大于1900):");
scanf("%d", &year);
if(year<1900)
{
printf("\n\n您输入的年份小于1900,请重新输入!\n");
exit(0);
}
// year = 2014;
printf("\n%15d年\n\n", year);
initial = (sumdays(year)%7+0)%7; //initial表示输入的年份1月1日应该空出几个格子
//其中0表示1900年1月1日是星期一,即前面不需要空格
for(month=1; month<=12; month++)
{
printf("%13d月\n\n", month);
printf("一 二 三 四 五 六 日\n");
if(initial<7)
for(i=1; i<=initial*4; i++) //4表示在打印的时候,每一天占用4个空格
putchar(bk);
for(i=initial; i<=monthdays(year,month)+initial-1; i++) //打印日期
{
mod = i%7;
if(mod==0&&i!=initial) printf("\n");
if(day<10) printf("%d%c%c%c", day++,bk,bk,bk); //为了显示整齐
else printf("%d%c%c", day++,bk,bk);
}
printf("\n\n");
initial = mod+1;
day =1; //初始化,下个月从1号开始打印
}
return 0;
}