题目
已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。
注意:短线“-”个数要与题目中一致,否则系统会判为错误。
输入
年月和月份
输出
无
样例输入
2010 9
样例输出
---------------------
Su Mo Tu We Th Fr Sa
---------------------
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
---------------------
解题思路
先计算出2007年的1月1日到输入月份的首日有多少天,并对7取模,得出的数值即为距离星期一差几天,再根据规律进行输出既可以。
易错点
- 第一行的输出:如果恰好待输出的月份的1号也是星期一,那么第一行不需要输出任何空格、数字、也不需要换行(83分时修正,但不在测试点范围内);
- 闰年的定义:能被4整除,但是不能被100整除(测试用例:2100 2,改好了这里83变为了正确);
- 2007年1月1日距离2007年2月1日相差的是31天,最终某天的
周几 = 相差天数%7+1
(比如2007年2月1日是周二)。
代码
//已知2007年1月1日为星期一
//即2006年的12月31日为星期日
#include<stdio.h>
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//int space[7] = {0,1,2,3,4,5,6};
void Print(int y, int m){
int i,j,d = month[m];
int days = 0;
if (m==2 && y%100!=0 && y%4==0)//确定要显示的天数
d++;
for (i=2007;i<=y;i++)//计算相隔多少天
{
if (i!=y)
{
days+=(365%7);
if (i%100!=0 && i%4==0)//闰年,366天
days++;
}
else
{
for (j=1;j<m;j++)
{
days+=(month[j]%7);
if (j==2 && y%4==0 && y%100!=0)//闰年2月多一天
days++;
}
}
}
days%=7;
//第一行
if (days!=6)
{
for (i=0;i<=days;i++)
printf(" ");
}
for (i=1;i<(7-days);i++)
{
printf("%3d",i);
if (i==(6-days))
printf("\n");
}
//之后的行
for (i;i<=d;i++)
{
printf("%3d",i);
if (i!=d && (i+days+1)%7==0)
printf("\n");
}
}
int main()
{
int y,m;
scanf("%d %d",&y,&m);
if (y>=2007)//2007年以前的拒绝打印
{
printf("---------------------\n");
printf(" Su Mo Tu We Th Fr Sa\n");
printf("---------------------\n");
Print(y,m);
printf("\n---------------------");
}
return 0;
}