Description
输出公元1900~2200年之间任意一月的月历。
Input
输入若干行,至EOF结束,每行两个整数,分别表示年和月。
Output
对应输入顺序输出月历,两个月历之间有一个空行。
每个月历的第一行为表头"Sun Mon Tue Wen Thu Fri Sat",表示星期日~星期六。第二行开始的每行为一个星期,把每月的1日~结尾一日对应阿拉伯数字填入其中。每列占3个字符,其中的数字右对齐,每两列之间一个空格分隔,每行最后一个数字后面不要有空格。最后一日后面不要有空格。
Sample Input
2019 11
2019 12
2020 1 2020 2
Sample Output
答案
#include<stdio.h>
//确定非闰年的每月的日期数;(从数组的yue[1]开始)
int yue[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//我们首先判断一下是否为闰年;闰年返回1;
int judge_run(int year)
{
if((year%100 != 0&&year%4 == 0)||year%400 == 0)
return 1;//闰年返回1;
else
return 0;
}
//泰勒公式:w = (d + 1+ 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
int put_year(int month,int year)
{
//***************************************
/*由于在泰勒公式中本年的 1,2月要按
上一年的 13,14月算;故在此先进行一个转化;*/
int mon = month;
if(mon == 1||mon == 2)
{
mon += 12;
year--;
}
//***************************************
int w =( 2 + 2*mon+3*(mon+1)/5+year+year/4-year/100+year/400)%7;
int cnt = 1;//记录判断何时输出空格与回车(\n)
for(int i = 1;i <= yue[month];i++)
{
//***************************************
//每月第一天前的空格;
while(w>0)
{
printf(" ");
if(cnt != 7)
printf(" ");
cnt++;
w--;
}
//***************************************
printf("%3d",i);
//*********************
//判断何时输出空格和回车
if(cnt == 7){
printf("\n");
cnt = 0;
}else{
if(i != yue[month])
printf(" ");
}
//**********************
cnt++;
}if(cnt != 1)
printf("\n");
}
int main()
{
int year,month;
while(scanf("%d %d",&year,&month) != EOF){
int run = judge_run(year);
if(run == 1)
yue[2] = 29;
else
yue[2] = 28;
printf("Sun Mon Tue Wen Thu Fri Sat\n");
put_year(month,year);
printf("\n");
}
return 0;
}