HUT1102 月份牌 一直在PE

1102: 月份牌

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 48  Solved: 2
[Submit][Status][Web Board]

Description

这里有一份2011年的月份牌可以参考

      January               February               March        
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 1 2 3 4 5 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28 27 28 29 30 31
30 31
April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 7 1 2 3 4
3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 29 30

July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
31
October November December
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 1 2 3 4 5 1 2 3
2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10
9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17
16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24
23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31
30 31

请编程实现输出给定年份(1-2050),给定月份(1-12)的月份牌。

Input

两个数 N M,表示公元N年,M月。

Output

该月的月份牌,注意格式。

Sample Input

2012 12

Sample Output

Su Mo Tu We Th Fr Sa
                               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

      网页好像不太兼容那格式。一直在PE啊,看了后台数据,无语了,手翻万年历,发现后台测试数据竟然是错的,我无语了。
  代码如下:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;

int day[13]= { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };// 这时平年各月对应的天数

int mday[13]= { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 

int firstday[2055]; // 存储每一年第一天是星期几

bool is_spe( int year )
{
	if( ( year% 4== 0&& year% 100!= 0 )|| year% 400== 0 )
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main(  )
{
	firstday[2011]= 6;
	for( int i= 2010; i>= 1; --i )
	{
		int curday= is_spe( i )? 366: 365;
		curday%= 7;
		firstday[i]= firstday[i+ 1]- curday;
		if( firstday[i]<= 0 )  firstday[i]+= 7;
	}
	for( int i= 2012; i<= 2050; ++i )
	{
		int curday= is_spe( i- 1 )? 366: 365;
		curday%= 7;
		firstday[i]= firstday[i- 1]+ curday;
		firstday[i]%= 7;
		if( !firstday[i] )  firstday[i]= 7;
	}
	int year, mon;
	while( scanf( "%d %d", &year, &mon )!= EOF )
	{
		int fday= firstday[year], num_day, sign;
		if( is_spe( year )&& mon> 2 )
		{
			num_day= day[mon- 1];
		}
		else
		{
			num_day= day[mon- 1]- 1;
		}
		sign= ( fday+ num_day )% 7;
		if( !sign )  sign= 7;
		int num_mday= ( is_spe( year )&& mon== 2 )? 29: mday[mon];
		puts( "Su Mo Tu We Th Fr Sa" );
		for( int i= 1; i<= num_mday; ++i )
		{
			int temp= ( sign+ i )% 7;
			for( int j= 0; i== 1&& j< temp; ++j )
			{
				printf( j== 0? "  ": "   " );
			}
			if( temp== 0 )
			{
				printf( "%2d", i );
			}
			else if( temp== 6 )
			{
				printf( "%3d\n", i );
			}
			else
			{
				printf( "%3d", i );
			}
			if( i== num_mday&& temp!= 6 )
			{
				puts( "" );
			}
		}
	}
	return 0;
}


/*Su Mo Tu We Th Fr Sa 
                   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*/ 
  
原文地址:https://www.cnblogs.com/Lyush/p/2124691.html