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&&y0!=0 || y@0==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;
}
转载请注明原文地址: https://ju.6miu.com/read-662636.html