USACO Section 1.1 Friday the Thirteenth

题目描述

星期五13日真的是一个不寻常的事件吗?
也就是说,这个月的十三日星期五比星期几下降多少? 为了回答这个问题,编写一个计划,计算每个月的第13天代表星期日,星期一,星期二,星期三,星期四,星期五和星期六在N年的给定时间内的频率。 测试时间为1900年1月1日至1900年12月31日,给定年数为N + 1,N为正,不超过400。

注意,开始的一年是1900,而不是1990年。

在解决此问题之前,您需要了解的几个事实:
1)1900年1月1日星期一。
2)三十天有9月,4月,6月和11月,除了二十八年,除了二十九年之外,其余的都有31个,除了闰年,有29个。
3)每年可以被4除以闰年(1992 = 4 * 498,所以1992年将是闰年,但1990年不是闰年)
4)上述规则不适用于一百年。 百年可分为400年是闰年,其他都没有。 因此,1700年,1800年,1900年和2100年的这个世纪不是闰年,而是2000年是闰年。
不要在计算机语言中使用任何内置的日期功能。
请不要只是预先计算答案。

程序名称:friday

输入格式

一行为整数N.
输入(file friday.in)

20
输出格式
七个空格在一行上分隔整数。 这些整数代表星期六,星期日,星期一,星期二,...,星期五代表的每个月13日的星期几的次数。
输出(file friday.out)
36 33 34 33 35 35 34
解题思路
本题主要思路是计算出每一年每一个月份距离1900年1月1日的天数,然后对一周七天的7取余的余数就是它的星期数距离1900年1月1日的星期数。其中特别要注意闰年的判断。
解题代码
/*
ID: 15189822
PROG: friday
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("friday.in");
ofstream fout("friday.out");
int day[2][13] = {31,31,28,31,30,31,30,31,31,30,31,30,0,31,31,29,31,30,31,30,31,31,30,31,30,0};
int r[8];
int pd(int n){//判断是不是闰年:是则返回1,否则返回0 
    if (n%4==0&&n%100!=0||n%400==0) return 1;
    return 0;
}
int main(){
    int n;
    fin>>n;
    memset(r,0,sizeof(r));
    r[6]=1;
    int sum=12,year=1900,p;
    for(int i=1;i<=12*n-1;i++){
        p=pd(year);
        sum +=day[p][i%12];
        r[sum%7+1]+=1;//sum%7+1:判断每个月是星期几  
        if(i%12==0) year+=1;
    }
    fout<<r[6]<<" "<<r[7]<<" ";
    for(int i=1;i<=4;i++) fout<<r[i]<<" ";
    fout<<r[5]<<endl;
    return 0;
}




猜你喜欢

转载自blog.csdn.net/YanLucyqi/article/details/72773100