当前位置:文档之家› USACO题目Friday the Thirteenth及代码解析

USACO题目Friday the Thirteenth及代码解析

描述
13号又是一个星期五。

13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。

给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
这里有一些你要知道的:
1、1900年1月1日是星期一.
2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.
3、年份可以被4整除的为闰年(1992=4*498 所以1992年是闰年,但是1990年不是闰年).
4、以上规则不适合于世纪年。

可以被400整除的世纪年为闰年,否则为平年。

所以,1700,1800,1900和2100年是平年,而2000年是闰年.
请不要调用现成的函数
请不要预先算好数据(就是叫不准打表)!
格式
PROGRAM NAME: friday
INPUT FORMAT:
(friday.in)
一个正整数n.
OUTPUT FORMAT:
(friday.out)
七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数..
输入格式
20
输出格式
36 33 34 33 35 35 34
程序:
#include<fstream>
using namespace std;
int main()
{
int year,month,i,n,last=3;
int dayOfMonth[12]={31,31,28,31,30,31,30,31,31,30,31,30};
int result[7]={0};
ifstream fin("friday.in");
ofstream fout("friday.out");
fin>>n;
for(year=1900;year<1900+n;++year){
if(year%400==0||(year%100!=0&&year%4==0)) dayOfMonth[2]=29;
for(month=0;month<12;++month){
last=(last+dayOfMonth[month])%7;
result[last]++;
}
dayOfMonth[2]=28;
}
for(i=0;i<6;++i) fout<<result[(i+6)%7]<<' ';
fout<<result[5]<<endl;
fin.close();
fout.close();
return 0;
}。

相关主题