样例输入 Copy
2012
样例输出 Copy
*Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 *Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
解题思路:首先计算出要打印的年份的第一天是星期几,然后计算出要打印的月份的第一天是星期几,考虑平年闰年,注意格式。
算法步骤:1、根据推到公式(y+(y-1)/4-y/100+y/400)%7,可计算出要打印的年份的第一天是星期几。
2、判断该年是平年还是闰年,知道该年第一天是星期几,可以知晓每个月的第一天是星期几。
3、注意格式,打印。
#include<stdio.h>
int mon[2][13]= {{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int pduan(int y)//判断平年、闰年
{
if((y%4==0&&y%100!=0)||(y%400==0))
return 1;
else
return 0;
}
打印月的第一天
int mon_day(int y,int m)
{
int w,f,i,sum=0;
f=pduan(y);
w=(y+(y-1)/4-y/100+y/400)%7;//该年第一天星期
for(i=1; i<m; i++)
{
sum=sum+mon[f][i];
}
sum=(sum+w)%7;
if(sum==0)
return 7;
return sum;
}
//打印函数,格式控制
void print(int y)
{
char s[60]="*Mon Tue Wed Thu Fri Sat Sun";
int i,f,m,cnt;
char str[9]=" ";
f=pduan(y);
for(m=1; m<=12; m++)
{
puts(s);//输出星期表头
cnt=0;//计数,每七个换行
for(i=0; i<mon_day(y,m)-1; i++)//输出空格
{
printf("%s",str);
cnt++;
}
for(i=1; i<=mon[f][m]; i++)
{
printf("%4d",i);
cnt++;
if(cnt!=0&&cnt%7==0)
printf("\n");
}
if(cnt!=0&&cnt%7!=0)
printf("\n");
}
}
int main()
{
int y;
scanf("%d",&y);
print(y);
return 0;
}