给你一个年份 y 和一个月份 m,请你按照样例的格式打印出 y 年第 m 月的月历。例如当 y=2015,m=1 时,2015 年 1 月的月历打印效果就应该如下:
样例的格式中,每一行为代表星期的字母,第一个字母 S
代表星期日,第二个字母 M
代表星期一,以此类推,第七个字母 S
代表星期六,第一个字母的左边没有空格,两个字母之间有三个空格分隔。接下来的几行是第 m
月的日期,每一列的数都与本列的第一个字母左对齐,同一行的两个日期之间要有若干个空格分隔。
为了简化题目的难度,输入还会给出一个正整数 n(n<8),表示第 y 年的 1 月 1 日 是星期 n。例如 2015 1 4
的含义是要输出 2015 年 1 月的日历,2015 年 1 月 1 日是星期四。
输入格式
输入仅有一行,包含三个正整数 y(1990<y<2100),m(0<m<13) 和 n(0<y<8),两数间用一个空格间隔。
输出格式
输出包含符合题目要求的若干行(请注意,每行末尾没有多余的空格)。
本题对结果的输出格式有严格要求,题目述的功能可以使用 TAB 键,在 C\C++ 中可以使用 \t
来实现。
样例输入
2015 1 4
样例输出
S M T W T F S
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
#include <iostream>
#include <iomanip>
using namespace std;
int day_of_year(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return 366;
}else{
return 365;
}
}
int day_of_month(int m,int y){
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
return 31;
}else if(day_of_year(y)==365&&m==2){
return 28;
}else if(day_of_year(y)==366&&m==2){
return 29;
}else if(m==4||m==6||m==9||m==11){
return 30;
}
}
int day_of_year_month(int y,int m){
int sum=0;
for(int i=1;i<m;i++){
sum+=day_of_month(i,y);
}
for(int i=1900;i<y;i++){
sum+=day_of_year(i);
}
return sum;
}
int main(){
int year;
int month;
int day;
int us_l;
cin>>year>>month>>day>>us_l;
int sum;
int day_c,cases=1;//声明天数,情况
sum=day_of_year_month(year,month);
day=sum%7+1;
day_c=day_of_month(month,year);
cout<<"S M T W T F S"<<endl;
for(int i=0;i<day%7;i++){
cout<<" ";
}
for(int i=1,j=day+1;i<=day_c;i++,j++){
cout<<setw(4)<<setiosflags(ios::left)<<i;
if(j%7==0){
cout<<endl;
}
}
cout<<endl;
return 0;
}