算出每个月的13号距离1900.1.1经过了多少天,然后模7就可以了,这个叫暴力破解(Brute force)?分析上是这么说的,whatever。。。 分析的循环又写的比我简洁,看来以后我得注意一下优化和深入分析了。。。 /* ID: LANG: C TASK: friday */ #include <stdio.h> #include <stdlib.h> /*#define leap(y) (y%400==0) || (y%100!=0 && y%4==0) ? 1 : 0*/ /*or y%4==0 && (y%100 != 0 || y%400 == 0)*//*两种写法均可*/ int isleap(int year) { if(year % 400 == 0 || (year % 100 != 0 && year % 4 ==0)) return 0; return 2; } int main() { FILE *fin = fopen("friday.in", "r"); FILE *fout = fopen("friday.out", "w"); int count[7] = {0}; int month[13] = {29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int i, j, n, days = -18;/*第一次加上31之后就是1900.1.13了*/ fscanf(fin, "%d", &n); for(i = 1900; i < 1900 + n; i++) { for(j = 1; j <= 12; j++) { if(j == 1) days += month[12];/*一月要加上12月的天数*/ else if(j == 3) days += month[isleap(i)];/*三月要加上2月的天数,注意闰年*/ else days += month[j - 1]; count[days % 7]++; } } for(i = 0; i < 7; i++) { if((i + 6) % 7 == 5) fprintf(fout, "%d/n", count[5]);/*格式要写对,最后换行,否则出错!*/ else fprintf(fout, "%d ", count[(i + 6) % 7]); } exit(0); }