/* ID:tianlin2 PROG:friday LANG:C++ */ #include <iostream> #include <fstream> using namespace std; bool runian(int year) //判断是不是闰年 { if(year%400==0||year%4==0&&year%100!=0) return true; else return false; } int main() { ofstream fout("friday.out"); ifstream fin("friday.in"); int y=1900,m=1,w=6; int n; int it[7]; for(int i=0;i!=7;++i) it[i]=0; it[6]=1; //1900年1月13是星期六,it数组存放星期几的天数 fin>>n; while(y!=1900+n-1 || m!=12) //每个月分开判断 { switch(m) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: w=(w+31)%7; break; case 4:case 6:case 9:case 11: w=(w+30)%7; break; case 2: if(runian(y)) w=(w+29)%7; else w=(w+28)%7; } ++it[w]; ++m; if(m>12) { m=m-12; ++y; } } fout<<it[6]<<' '; for(int h=0;h!=6;++h) { if(h!=5) fout<<it[h]<<' '; else fout<<it[h]; } fout<<endl; return 0; }
月历的题目一般都比较简单,主要抓住规律就可以了!
官方答案:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> int isleap(int y) { return y%4==0 && (y%100 != 0 || y%400 == 0); } int mtab[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* return length of month m in year y */ //这里二月天数的判断方法很巧妙,值得学习 int mlen(int y, int m) { if(m == 1) /* february */ return mtab[m]+isleap(y); else return mtab[m]; } //以下的算法和我的基本相同 void main(void) { FILE *fin, *fout; int i, m, dow, n, y; int ndow[7]; fin = fopen("friday.in", "r"); fout = fopen("friday.out", "w"); assert(fin != NULL && fout != NULL); fscanf(fin, "%d", &n); for(i=0; i<7; i++) ndow[i] = 0; dow = 0; /* day of week: January 13, 1900 was a Saturday = 0 */ for(y=1900; y<1900+n; y++) { for(m=0; m<12; m++) { ndow[dow]++; dow = (dow+mlen(y, m)) % 7; } } //当i==0时不输入空格,这里的方法很强大... for(i=0; i<7; i++) { if(i) fprintf(fout, " "); fprintf(fout, "%d", ndow[i]); } fprintf(fout, "/n"); exit(0); }