# Friday the Thirteenth（模拟）

xiaoxiao2021-03-01  8

Friday the Thirteenth

Is Friday the 13th really an unusual event?

That is, does the 13th of the month land on a Friday less often than on any other day of the week? To answer this question, write a program that will compute the frequency that the 13th of each month lands on Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, and Saturday over a given period of N years. The time period to test will be from January 1, 1900 to December 31, 1900+N-1 for a given number of years, N. N is positive and will not exceed 400.

Note that the start year is NINETEEN HUNDRED, not 1990.

There are few facts you need to know before you can solve this problem:

January 1, 1900 was on a Monday.Thirty days has September, April, June, and November, all the rest have 31 except for February which has 28 except in leap years when it has 29.Every year evenly divisible by 4 is a leap year (1992 = 4*498 so 1992 will be a leap year, but the year 1990 is not a leap year)The rule above does not hold for century years. Century years divisible by 400 are leap years, all other are not. Thus, the century years 1700, 1800, 1900 and 2100 are not leap years, but 2000 is a leap year.

Do not use any built-in date functions in your computer language.

### INPUT FORMAT

One line with the integer N.

20

### OUTPUT FORMAT

Seven space separated integers on one line. These integers represent the number of times the 13th falls on Saturday, Sunday, Monday, Tuesday, ..., Friday.

### SAMPLE OUTPUT (file friday.out)

36 33 34 33 35 35 34

题意：

输入数字N，N不超过400，输出1900年1月1到，1900+N-1年12月31号里，每个月的第13号是星期几，最后以星期6 7 1 2 3 4 5这个顺序输出总共天数。

思路：

从1900年1月13号算起，每过一个月就加上相应月份的天数，得出来的总体天数对7取余即可得出星期几，对应的星期几可用数组表示来累计算出，直到1900+N-1年12月31号为止（两个FOR）。要注意的是最后一次循环会多加一个月份，所以最后还要减去最后一次算出来的星期几。

First and wrong：

#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { int from=1900,N,i,j,sum; int date[7]; memset(date,0,sizeof(date)); sum=13; date[sum%7]++; scanf("%d",&N); for(i=from;i<=from+N-1;i++) { for(j=1;j<=12;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) sum+=31; if(j==4||j==6||j==9||j==11) sum+=30; if(j==2) { if((i@0==0)||((i%4==0&&i0!=0))) sum+=29; else sum+=28; } // 写完后，发现得出来的结果不正确，所以想观察一下前几项输出情况来看看正不正确 // printf("\n%d %d\n",sum,sum%7); // system("pause"); date[sum%7]++; } } date[sum%7]--; //最后一次要减回来 printf("%d %d ",date[6],date[0]); //不是7是0，粗心 for(i=1;i<=5;i++) { printf("%d",date[i]); i==5?printf("\n"):printf(" "); } }

AC finally：

/* TASK:friday LANG:C ID:sum-g1 */ #include<stdio.h> #include<string.h> int main() { FILE *fin =fopen("friday.in", "r"); FILE *fout=fopen("friday.out", "w"); int from=1900,N,i,j,sum; int date[7]; memset(date,0,sizeof(date)); sum=13; date[sum%7]++; fscanf(fin,"%d",&N); for(i=from;i<=from+N-1;i++) { for(j=1;j<=12;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) sum+=31; if(j==4||j==6||j==9||j==11) sum+=30; if(j==2) { if((i@0==0)||((i%4==0&&i0!=0))) sum+=29; else sum+=28; } date[sum%7]++; } } date[sum%7]--; //最后一次要减回来 fprintf(fout,"%d %d ",date[6],date[0]); //星期日是0，不是7.... for(i=1;i<=5;i++) { fprintf(fout,"%d",date[i]); i==5?fprintf(fout,"\n"):fprintf(fout," "); } exit(0); }

总结:

题目虽然简单，但是还是很粗心，花的时间太长了，不能因为简单就随便对待，错误一定要自己找出来，无论花多长时间。