CCF CSP 201503-3 節日

CCF計算機職業資格認證考試題解系列文章爲meelo原創,請務必以連接形式註明本文地址html

CCF CSP 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分別表示星期1、2、……、6、日。

輸出格式

  對於 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 ≤  y 1y 2 ≤ 2050。

解析

計算的流程:

1.計算1年~y年有多少個閏年spa

2.計算y年a月1日離1年1月1日有多少天code

3.計算y年a月1日星期幾htm

4.計算y年a月第b個星期c離a月1日有多少天blog

5.判斷是否這一天是否存在get

計算的一個麻煩的地方是,人類是從1開始計數的,容易產生一些詭異的邊界狀況。下面的代碼中首先把輸入的數據轉換成了從0開始計數。io

代碼

C++class

#include <stdio.h>

int daysOfMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

// y年是不是閏年 
bool isLeap(int y) {
    return y%4==0 && y%100!=0 || y%400==0;
}

// 0001年到y年(包括)有多少個閏年 
int numLeapYear(int y) {
    return y/4 - y/100 + y/400;
}

// y/m/d離0001/01/01有多少天
// 0001/01/01星期一 
int numDays(int y, int m, int d) {
    int days = 365 * (y-1);
    days += numLeapYear(y-1);
    int i = 0;
    while(i < m) {
        days += daysOfMonth[i];
        i++;
    }
    days += d;
    return days;
}

// y/m/d 星期幾 
int weekday(int y, int m, int d) {
    int days = numDays(y, m, d);
    int weekd = 0;
    weekd = (weekd + days) % 7;
    return weekd;
}

int main() {
    int a, b, c, y1, y2;
    scanf("%d%d%d%d%d", &a, &b, &c, &y1, &y2);
    a--, b--, c--; // 月份,日期默認從0開始計數
    
    for(int y=y1; y<=y2; y++) {
        if(isLeap(y)) month[1] = 29;
        else month[1] = 28;
        int weekd = weekday(y, a, 0); // y年a月1日星期幾 
        int day = (c-weekd+7)%7 + b*7;
        if(day>=daysOfMonth[a]) printf("none\n");
        else printf("%04d/%02d/%02d\n", y, a+1, day+1);
    }
}
相關文章
相關標籤/搜索