USACO-Section1.1 Friday the Thirteenth

2017-05-25

题目大意:

13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在星期六,星期日,星期一...星期五的次数,N为正整数且不大于400.

样例输入:

20

样例输出:

36 33 34 33 35 35 34

题解:

使用欧拉函数直接判断。

代码:

    #include
    #include
    #include
    using namespace std;
    int n;
    int times[7];
    //欧拉函数
    void zeller(int y , int m ,int d){
        if(m < 3){ //第一年的前两个月当成上一年的13,14月
            m += 12;
            y--;
        }
        int w = (y + y / 4 + y / 400 - y / 100 + 2 * m + 3 * (m + 1) / 5 + d) % 7;
        times[w]++; //times[0]是星期一,依次类推
    }

    int main(){
        memset(times , 0 , sizeof(times));
        ofstream cout("friday.out");
        ifstream cin("friday.in");
        cin >> n;
        for(int i = 0;i < n;i++){
            for(int j = 1;j <= 12;j++){
                zeller(1900 + i , j , 13);
            }
        }
        cout << times[5] << " "<< times[6]<<" ";
        for(int i = 0;i < 4;i++){
            cout << times[i] << " ";
        }
        cout << times[4] << endl;
        return 0;
    }

你可能感兴趣的:(USACO)