24:打印月历【2019夏令营B】
-
总时间限制:
1000ms
-
内存限制:
65536kB
-
描述
给定年月,打印当月的月历表。
-
输入
输入为一行两个整数,第一个整数是年份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日是周一。
题解
-
复习对齐输出
cprintf("%6d\n", a); //右对齐6位 printf("%-6d\n", a);//左对齐6位
c++
#include <iomanip> cout<<setw(6)<<left<<...;//左对齐,宽度6 cout<<setw(6)<<right<<...; //默认填充对齐部分的是' ' cout.fill('#');//设置填充字符 cout.fill(' ');//不想要时需要取消
-
求[1900.1.1, y.m.1)的天数,%7确认是y.m.1周几
-
如1900.1.8,7天,%7=0,则1.8的前一天是周日,所以1.8是周一,前面空天数1(Sun开始)
-
bool isleap(int y){
return (y%4==0&&y%100) || y%400==0;
}
int mdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y,m;
cin>>y>>m;
int days=(y-1900)*365; //[1900,y) days
for(int i=1900; i<y; ++i){
if(isleap(i)){
++days;
}
}
//[1,m) days
for(int i=1; i<m; ++i){
days+=mdays[i];
}
bool islp=isleap(y);
if(islp && m>2){
++days;
}
cout<<"Sun Mon Tue Wed Thu Fri Sat"<<endl;
int week = days%7 + 1;//white num
string white(4*week, ' ');//week* 4' '
cout<<white;
int pos=week;//idx
int d=mdays[m];
if(islp && m==2){
++d;
}
for(int i=1; i<=d; ++i){
cout<<setw(3)<<right<<i;
++pos;
if(pos==7){
cout<<"\n";
pos=0;
}
else{
cout<<" ";
}
}
return 0;
}