山东科技大学oj 2423: 输出月历(II)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值