USACO 1.1.3 Friday The Thirteenth
//译题 //★Friday the Thirteenth 黑色星期五 13 号又是星期五是一个不寻常的日子吗? 13 号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在n 年里13 日落在星期一,星期二......星期日的次数.这个测试从1900 年1 月1 日到 1900+n-1 年12 月31 日.n 是一个非负数且不大于400. 这里有一些你要知道的: 1900 年1 月1 日是星期一. 4,6,11 和9 月有30 天.其他月份除了2 月有31 天.闰年2 月有29 天,平年2 月有28 天. 年份可以被4 整除的为闰年(1992=4*498 所以 1992 年是闰年,但是1990 年不是闰年) 以上规则不适合于世纪年.可以被400 整除的世纪年为闰年,否则为平年.所以,1700,1800,1900 和 2100 年是平年,而2000 年是闰年. 请不要预先算好数据! PROGRAM NAME: friday INPUT FORMAT 一个整数n. SAMPLE INPUT (file friday.in) 20 OUTPUT FORMAT 七个在一行且相分开的整数,它们代表13 日是星期六,星期日,星期一.....星期五的次数. SAMPLE OUTPUT (file friday.out)
36 33 34 33 35 35 34
/* ID: china_l LANG: C TASK: friday */ #include<stdio.h> int main() { int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int day[7]={0}; int i,j,n,t=1900,m=6; freopen("friday.in","r",stdin); freopen("friday.out","w",stdout); scanf("%d",&n); t+=n; for(i=1900;i<t;i++) { if(i%400 == 0 ||(i%100!=0 && i%4 == 0)) //判断是否是闰年 mon[1]=29; //是,2月为29天 else mon[1]=28; //不是,2月为28天 for(j=0;j<12;j++) //然后计算每个月的13号是星期几 { //因为1900.1.1是星期一,1900.1.13是星期六,最开始m=6代表的就是1.13号是星期六 day[m]++; //在数组中对应的星期+1(day[0-6],分别对应星期日,星期一到星期六) m+=mon[j]; //加上本月的天数,得到下个月13号的天数 m%=7; //%7,得到下个月的13号对应的是星期几 } //因为7%7=0;所以星期天的总天数存放在day[0]中 } printf("%d",day[6]); //按照题目意思,先打印星期六 for(i=0;i<6;i++) //然后打印星期天,星期一到星期五 printf(" %d",day[i]); printf("\n"); return 0; }