PRoblem : 月份牌问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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 52 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 129 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 1916 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 2623 24 25 26 27 28 29 27 28 27 28 29 30 3130 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 43 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 1110 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 1817 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 2524 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 33 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 1010 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 1717 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 2424 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 3031 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 32 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 109 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 1716 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 2423 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 3130 31请编程实现输出给定年份(1600-2050),给定月份(1-12)的月份牌。Input两个数 N M,表示公元N年,M月。Output该月的月份牌,注意格式。Sample Input2012 12Sample OutputSu Mo Tu We Th Fr Sa 12 3 4 5 6 7 89 10 11 12 13 14 1516 17 18 19 20 21 2223 24 25 26 27 28 2930 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;}