题目
题解
注意两点:
- 计算从2007.1.1到输入年份、月份的天数;
- 根据天数算出输入的月份开始于星期几。
计算出这两个,控制一下输出格式就可以了。
天数的计算:
众所周知的口诀
一三五七八十腊,三十一天永不差,四六九冬三十整……
一月、三月、五月、七月、八月、十月、十二月都是三十一天;四月、六月、九月、十一月都是三十天;闰年二月是二十九天,其他时候二月都是二十八天。
闰年:年份能被400整除,或能被4整除但不能被100整除
也就是闰年一年是366天,平年一年是365天。
知道了这些知识就可以计算出天数了,假设输入的年份为year,月份为month。
因为题目告诉2007.01.01的信息了,因此我们要以2007.01.01为起点向后推算。
2007 ~ year-1的天数,含义为2007全年的天数(平年365)、2008全年的天数(闰年366)、……、year-1全年的天数;
算出第year年之前的天数了,但是从第year年1月1日开始到第year年month-1月最后一天的天数还没算。给个循环累加一下就行了,但还是要注意判断平闰。
两部分的累加和就是总天数。
得到天数,以2007.01.01的星期一为起始,每7天循环一个星期,不用多讲了吧。
强调一点,上面闰年的定义啊,每个月的天数啊,天数的求法啊都要掌握,蓝桥经常出。
代码
#include<bits/stdc++.h>
using namespace std;
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year, month, sum, res;
int main()
{
cin>>year>>month;
cout<<"---------------------"<<endl;
cout<<" Su Mo Tu We Th Fr Sa"<<endl;
cout<<"---------------------"<<endl;
sum = 365;
for(int i = 2007;i < year;i ++) res += ((i%400==0 || (i%4==0 && i%100!=0))?1:0) + sum; // 闰年多一天
if(year%400==0 || (year%4==0 && year%100!=0)) mon[2] ++; // 闰年多一天
for(int i = 1;i < month;i ++) res += mon[i];
int ii = (res%7==6?0:res%7+1);
for(int i = 1;i <= ii;i ++) cout<<" ";
for(int i = ii, j = 1;j <= mon[month];i ++,j ++) {
if(i == 7) i = 0, cout<<endl;
printf("%3d", j);
}
cout<<endl<<"---------------------"<<endl;
return 0;
}