CCF——节日

来源:互联网 发布:g41 g42编程实例 编辑:程序博客网 时间:2024/04/27 21:30

问题描述:

有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。

  现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。
  提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。
  为了方便你推算,已知1850年1月1日是星期二。

输入格式:

输入包含恰好一行,有五个整数a, b, c, y1, y2。其中c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。

输出格式:

对于y1和y2之间的每一个年份,包括y1和y2,按照年份从小到大的顺序输出一行。

  如果该年的a月第b个星期c确实存在,则以”yyyy/mm/dd”的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠“/”分隔,位数不足时前补零。
  如果该年的a月第b个星期c并不存在,则输出”none”(不包含双引号)。

样例输入:

5 2 7 2014 2015

样例输出

2014/05/112015/05/10

约定

满足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1, y2 ≤ 2050。

思路:

此题主要还是求日期,看题目要求,觉得做个日历表出来,直接查询就了当完事,不过看到题目后面,假设1850年的1月1日为周二,就决定放弃这条选择了,1850年到2015年,这中间的数据得记录多少,而且某些还不用,所以太过浪费时间。再想想,采用每周的周期来求解,1850年的第一个周二是1月1日,那么第二个周二不就是1月8日吗,中间相乘一个周期——7,那么明年的1月1日是周几,直接用今年的所有天数对7进行求余数即可,为0代表周日,其余分别代表周一,周二,周三,周四,周五,周六。那么基本解法就出来了。

Code:

#include <iostream>using namespace std;int a1[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };   //平年int a2 = 29;                                            //闰年,2月是29天int main(){    int m, n, day, y1, y2;    while (cin >> m >> n >> day >> y1 >> y2)    {        day %= 7;        int s = 0;        //统计天数        for (int i = 1850; i < y1; i++)        {            if ((i % 4 == 0 && i % 100 != 0) || (i% 400 == 0))                s += 366;            else                s += 365;        }        for (int i = y1; i <= y2; i++)        {            int t = 0;            int _day = 0;            bool flag = false;            int _current = 0;             int _m = 0;          //存储日期号数            if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))                flag = true;                //计算当年的前几个月的天数            for (int j = 0; j < m - 1; j++)                if (j == 1 && flag == true)                    t += a2;                else                    t += a1[j];            s += t;            s += 2;            int _tes = s % 7;            //进行判断是该月的周几,多少号            for (int k = 0; k < n; k++)                for (int p = 1; p <= 7; p++)                {                    t++;                    if (_tes % 7 == day&&k==n-1)                        _m = _current;                    _tes++;                    _current++;                }            s -= t;            s -= 2;            //计算完当年            if (flag)                s += 366;            else                s += 365;            //按照格式输出            if (n > 4)            {                cout << "none" << endl;                continue;            }            if (m < 10)            {                cout << i << "/" << "0" << m << "/";            }            else                cout << i << "/" << m << "/";            if (_m< 10)            {                if (_m==0)                {                    cout << "0" << _m+1 << endl;                }                else                    cout << "0" << _m << endl;            }            else                cout << _m << endl;        }    }    return 0;}

这里写图片描述

原创粉丝点击