日期类问题之月份牌问题

Problem : 月份牌问题
Time Limit:  1 Sec   Memory Limit:  128 MB
Submit:  38   Solved:  11
[ 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

请编程实现输出给定年份(1600-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

  具体思路:本题就是一个日期类问题,注意闰年和平年的二月份天数的表示,还有的技巧就是如何控制输出。注意公元一月一日是星期一,直接从这一天 往后推即可
 
#include<cstdio>
#include<iostream>
using namespace std;
 
bool isLeap(int y){
	if(y%4==0&&y%100!=0 || y%400==0)
	   return true;
	else
	   return false; 
}
 
int main(){
	int y,m;
	int ms[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	while(scanf("%d%d",&y,&m)!=EOF){
		printf("Su Mo Tu We Th Fr Sa\n");
		if(isLeap(y))
		   ms[2]=29;
		else 
		   ms[2]=28;
		int sum=0;  
		for(int i=1;i<y;i++)
		{
			if(isLeap(i))
			   sum+=366;
			else 
			  sum+=365;
		} 
		for(int i=1;i<m;i++) 
		  sum+=ms[i];
		sum+=1;
		int flag = sum%7,sum1=0;
		switch(flag)
		{
			//后者比前者多三个空格 
			case 0: printf(" 1");sum1=1;break;
			case 1: printf("    1");sum1=2;break;
			case 2: printf("       1");sum1 = 3;break;
			case 3: printf("          1");sum1=4;break;
			case 4: printf("             1");sum1 = 5;break;
			case 5: printf("                1");sum1=6;break;
			case 6: printf("                   1"); sum1=7;break; 
		}
		if(sum1%7==0)
		   printf("\n"); //遇到7的倍数要换行
		for(int k=2;k<=ms[m];k++){
			sum1++; 
			if(sum1%7==0)
			{
				//说明这是一行的最后一个
				//先输出与前一个数保持距离的空格
				printf(" ");
				if(k>=1&&k<=9)
				 printf(" %d\n",k);
				else 
				 printf("%d\n",k);
			}
			else if(sum1%7==1)
			{
				//表示这是开头的第一个
				if(k>=1&&k<=9)
				 printf(" %d",k);
				else 
				 printf("%d",k);
			}
			else{
				
				printf(" ");
				if(k>=1&&k<=9)
				 printf(" %d",k);
				else 
				 printf("%d",k);
				
			} 
		} 
		printf("\n");
	}
	return 0;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值