43. 【日期】黑色星期五(数组)

在西方,星期五和数字13都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的十三日又恰逢星期五就叫"黑色星期五”。

输入:

    年份

输出:

    判断该年是否包含黑色星期五,如包含,给出具体日期

 

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例 1

以文本方式显示


2006↵


以文本方式显示


  1. There are 2 Black Fridays in year 2006.↵
  2. They are:↵
  3. 2006/1/13↵
  4. 2006/10/13↵


1秒

64M

0

 

代码如下:

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#define DAY 13
int common_month(int month);
int leap(int i);
int date(int year, int month, int day);
int main(void)
{
    /*判断每年的1月13号是不是星期五,2月13号……直到12月13号,是的话,counter++
    * 引用21题的代码,“根据日期求星期”,在这个程序中,星期一返回1,星期二返回2……星期日返回0
    */
    int year, month;
    scanf("%d", &year);
    int counter = 0;
    int m[12] = { 0 };
    for (month = 1; month <= 12; month++) {
        if (5 == date(year, month, DAY)) {
            counter++;
            m[counter] = month;
        }
    }
    printf("There are %d Black Fridays in year %d.\n", counter, year);
    printf("They are:\n");
    for (int i = 1; m[i] != 0; i++)
        printf("%d/%d/%d\n", year, m[i], DAY);
    return 0;
}
int date(int year,int month,int day)
{
    //已知1900年1月1日为星期一   
    const int date = 1900;
    /*int year, month, day;
    scanf("%d %d %d", &year, &month, &day);*/
    int sum = 0;
    int i = year;
    //累加年的天数    
    for (i = year; i > date; i--) {
        sum += leap(i - 1);
    }
    //累加月的天数    
    if (leap(year) == 365) {    //平年  
        for (i = 1; i < month; i++) {
            sum += common_month(i);
        }
    }
    else {                  //闰年  
        for (i = 1; i < month; i++) {
            sum += common_month(i);
        }
        if (month > 2) {
            sum += 1;
        }
    }
    //累加日的天数    
    sum += day;
    int weekday = sum % 7;
    return weekday;
}
int leap(int i)
{
    int result = 365;
    if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
        result = 366;
    }
    return result;
}
int common_month(int month)
{
    int result = 0;
    switch (month) {
    case 1:
        result = 31;
        break;
    case 2:
        result = 28;
        break;
    case 3:
        result = 31;
        break;
    case 4:
        result = 30;
        break;
    case 5:
        result = 31;
        break;
    case 6:
        result = 30;
        break;
    case 7:
        result = 31;
        break;
    case 8:
        result = 31;
        break;
    case 9:
        result = 30;
        break;
    case 10:
        result = 31;
        break;
    case 11:
        result = 30;
        break;
    case 12:
        result = 31;
        break;
    }
    return result;
}