`
Simone_chou
  • 浏览: 197378 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Friday the Thirteenth(模拟)

 
阅读更多
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.

Don't just precompute the answers, either, please.

PROGRAM NAME: friday

INPUT FORMAT

One line with the integer N.

SAMPLE INPUT (file friday.in)

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%400==0)||((i%4==0&&i%100!=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%400==0)||((i%4==0&&i%100!=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);
}

 

 总结:

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

 

分享到:
评论

相关推荐

    USACO所有题目题解

    本文主要解析其中三个题目:“Your Ride Is Here (ride)”,“Greedy Gift Givers (gift1)”,以及“Friday the Thirteenth (friday)”。 1. **Your Ride Is Here (ride)**: 这是一个相对简单的问题,属于"ad hoc...

    第1章总结1

    同时,"Friday the Thirteenth"题目引入了模运算,"Broken Necklace"则涉及到数组的使用。 接着,1.2节重点是完整搜索,如"Milking Cows"中运用离散化技术,"Transformations"和"Name That Number"通过枚举解决,而...

    Usaco总结&题解

    2. **模拟算法**:这部分主要通过模拟实际场景来解决问题,例如题目《Greedy Gift Givers》和《Friday the Thirteenth》等,通过模拟礼物赠送过程或者日期计算来得出答案。 3. **枚举算法**:例如题目《Prime ...

    USACO(Train)解题报告.doc

    ### Chapter 1 Section 1.2 - Friday the Thirteenth (friday) 此题涉及到日期计算。通过模拟计算,可以按月或按年计算第13号是星期几。对于小规模数据,可以逐月处理;对于大规模数据,可以以年为单位,考虑闰年的...

    USACO题解(NOCOW整理版).doc

    Chapter 1 Section 1.1 Friday the Thirteenth (friday) 这道题的解决方案是使用模拟运算,按照月为单位计算,记录每个月的 13 日是星期几,然后输出结果。该算法的复杂度较低,适合小规模数据。当数据比较大时,...

    USACO全部译题

    - **1.1.3 Friday the Thirteenth** **知识点**:日期计算和模式匹配。理解日期的计算规则以及如何在给定的模式中寻找特定的日期。 - **1.1.4 Broken Necklace** **知识点**:字符串处理与动态规划。对于这类...

    USACO chap1 题解

    #### FridaytheThirteenth(friday) - **题目概述**:题目要求计算在特定年份范围内每个月13日是星期五的次数。 - **解题策略**: - 利用模拟方法,根据1900年1月13日是星期六这一已知条件,逐月计算13日对应的...

    USACO全部题目

    #### Friday the Thirteenth 这是一个与日期相关的题目,要求找出特定月份中13号落在星期五的情况。这类问题可以通过模拟每个月的日历以及对7取余的方式来实现。此外,还需要考虑到闰年和平年的区别,这对于正确...

Global site tag (gtag.js) - Google Analytics