题目描述:
题目描述
给定年月,打印当月的月历表。
输入描述
输入为一行两个整数,第一个整数是年份year(1900 ≤ year ≤ 2099),第二个整数是月份month(1 ≤ month ≤ 12),中间用单个空格隔开。
输出描述
输出为月历表。月历表第一行为星期表头,如下所示:
Sun Mon Tue Wed Thu Fri Sat
其余各行一次是当月各天的日期,从1日开始到31日(30日或28日)。
日期数字应于星期表头右对齐,即各位数与星期表头相应缩写的最后一个字母对齐。日期中间用空格分隔出空白。
样例
输入
2006 5
输出
Sun Mon Tue Wed Thu Fri Sat 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
提示
闰年判断方法:能被4整除但不能被100整除,或者能被400整除。
1900年1月1日是周一。
AC代码(这题我做了两天)~~:
#include<bits/stdc++.h>
using namespace std;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int y,m;
bool rn(int y){
if(y%4==0&&y%100!=0||y%400==0){
return 1;
}
return 0;
}
int main(){
cin>>y>>m;
long long sum=1;
for(int i=1900;i<y;++i){
if(rn(i)){
sum+=366;
}
else{
sum+=365;
}
}
if(rn(y)){
a[2]=29;
}
for(int i=1;i<m;++i){
sum+=a[i];
}
int cnt=sum%7;
cout<<"Sun Mon Tue Wed Thu Fri Sat"<<'\n';
for(int i=1;i<=cnt;++i){
cout<<" ";
}
for(int i=1;i<=a[m];++i){
cout<<setw(3)<<i<<" ";
cnt++;
if(cnt%7==0){
cout<<"\n";
}
}
return 0;
}
最后总结一下吧:这题说难不难,说简单也绝不简单。
彩蛋:我测了一个样例:123456789 1
Sun Mon Tue Wed Thu Fri Sat
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
我们还不一定能活到这年份,月历活到了。