zoukankan      html  css  js  c++  java
  • 节日 201503-3

    问题描述
      有一类节日的日期并不是固定的,而是以“ a月的第 b个星期 c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。
      现在,给你 abcy 1y 2(1850 ≤  y 1y 2 ≤ 2050),希望你输出从公元 y 1年到公元 y 2年间的每年的 a月的第 b个星期 c的日期。
      提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。
      为了方便你推算,已知1850年1月1日是星期二。
    输入格式
      输入包含恰好一行,有五个整数 abcy 1y 2。其中 c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。
    输出格式
      对于 y 1y 2之间的每一个年份,包括 y 1y 2,按照年份从小到大的顺序输出一行。
      如果该年的 a月第 b个星期 c确实存在,则以"yyyy/mm/dd"的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠“/”分隔,位数不足时前补零。
      如果该年的 a月第 b个星期 c并不存在,则输出"none"(不包含双引号)。
    样例输入
    5 2 7 2014 2015
    样例输出
    2014/05/11
    2015/05/10
    评测用例规模与约定

      所有评测用例都满足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1y2 ≤ 2050。

    参考代码:

    #include <iostream>
    using namespace std;
    bool Is(int x){
    if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0){
    return true;
    }
    return false;
    };
    int main(){
    int a, b, c, y1, y2;
    cin >> a >> b >> c >> y1 >> y2;
    int s;
    s = (y1 - 1850) / 4 * (365 * 3 + 366);
    if (y1>1900){
    s--;
    }
    if ((y1 - 1850) % 4 == 1){
    s += 365;
    }
    else if ((y1 - 1850) % 4 == 2){
    s += 365 + 365;
    }
    else if ((y1 - 1850) % 4 == 3){
    s += 365 + 365 + 366;
    }
    int xingqi;
    xingqi =(s+1) % 7+1;
    int *m = new int[12];
    m[0] = 31; m[1] = 28; m[2] = 31;
    m[3] = 30; m[4] = 31; m[5] = 30;
    m[6] = 31; m[7] = 31; m[8] = 30;
    m[9] = 31; m[10] = 30; m[11] = 31;
    int m1 = 0;
    int result = 0;
    int x;
    for (int i = y1; i <= y2;i++){
    m[1] = 28;
    m1 = 0;
    result = 0;
    x=0;
    if (Is(i)){
    m[1]++;
    }
    for (int j = 0; j < a-1; j++){
    m1 += m[j];
    }
    x = (m1 % 7 + xingqi) % 7;

    result = 1 + (b - 1) * 7 + (c + 7 - x) % 7;//完美
    if (result>m[a-1]){
    cout << "none" << endl;
    }
    else{
    if (a<10){
    if (result<10){
    cout << i << "/" << "0" << a << "/"<<"0" << result << endl;
    }
    else{
    cout << i << "/" << "0" << a << "/" << result << endl;
    }
    }
    else{
    if (result<10){
    cout << i << "/"<< a << "/" << "0" << result << endl;
    }
    else{
    cout << i << "/" << a << "/" << result << endl;
    }
    }
    }
    if (Is(i)){
    xingqi = (xingqi + 366-1)%7+1;
    }
    else{
    xingqi = (xingqi + 365-1)%7+1;
    }
    }
    return 0;
    }

    提交结果: 

    代码长度编程语言评测结果得分时间使用空间使用
    1.444KB C++ 正确 100 0ms 496.0KB


  • 相关阅读:
    [BZOJ3160]万径人踪灭
    [BZOJ5212][ZJOI2018]历史
    [BZOJ3563&3569]DZY Loves Chinese
    [HDU4336]Card Collector
    [HDU4652]Dice
    [POJ3683]Priest John's Busiest Day
    ISODateTimeFormat 转换2019-08-15T00:36:49.366456463Z 日期格式
    GoTTY-K8S-Docker 终端
    【php】PHP对redis操作详解
    【tool】VLC播放rtmp协议
  • 原文地址:https://www.cnblogs.com/bao-ZhangJiao/p/14268808.html
Copyright © 2011-2022 走看看