除了第一年的1月另外計算,
往後的1月13號都是去年的12月13號 + 31(DEC)。
/*
ID: mythnc2
LANG: C
TASK: friday
2011/10/26 19:37:31
*/
#include <stdio.h>
#define MONTHS 12
#define FIRSTYEAR 1900
#define WEEK 7
int leap(int);
int main (void)
{
FILE *fin, *fout;
int n, i, j, day;
int thirteen[WEEK] = { 0 };
int month[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
enum Months {JAN, FEB};
fin = fopen("friday.in", "r");
fout = fopen("friday.out", "w");
fscanf(fin, "%d", &n);
/* simplify months */
for (i = 0; i < MONTHS; i++)
month[i] %= WEEK;
for (day = 1 + 12, i = 0; i < n; i++) {
if (i > 0) /* DEC/13 + 31 = JAN/13 */
day += month[j];
day %= WEEK;
thirteen[day]++;
for (j = JAN; j < MONTHS - 1; j++) {
day += month[j];
if (j == FEB && leap(i))
day++;
day %= WEEK;
thirteen[day]++;
}
}
/* printout: from sat to fri */
fprintf(fout, "%d", thirteen[WEEK - 1]);
for (i = 0; i < WEEK - 1; i++)
fprintf(fout, " %d", thirteen[i]);
fprintf(fout, "\n");
return 0;
}
/* leap: calculate the year is a leap year or not
* return 1 if is, 0 if is not */
int leap(int i)
{
int year;
year = FIRSTYEAR + i;
return year % 4 == 0 && year % 100 != 0
|| year % 400 == 0;
}
沒有留言:
張貼留言