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