寒假每日一题题解(1.20)十三号星期五

十三号星期五

十三号星期五真的很不常见吗?

每个月的十三号是星期五的频率是否比一周中的其他几天低?

请编写一个程序,计算 N 年内每个月的 13 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。

测试的时间段将会开始于 1900 年 1 月 1 日,结束于 1900+N−1 年 12 月 31日。

一些有助于你解题的额外信息:

  1. 1900 年 1 月 1 日是星期一。
  2. 在一年中,4 月、6 月、9 月、11 月每个月 30 天,2 月平年 28 天,闰年 2929 天,其他月份每个月31天。
  3. 公历年份是 44 的倍数且不是 100 的倍数的年份为闰年,例如 1992 年是闰年,1990 年不是闰年。
  4. 公历年份是整百数并且是 400 的倍数的也是闰年,例如1700年,1800年,1900年,2100年不是闰年,2000年是闰年。

输入格式

共一行,包含一个整数 N。

输出格式

共一行,包含七个整数,整数之间用一个空格隔开,依次表示星期六,星期日,星期一,星期二,星期三,星期四,星期五在十三号出现的次数。

数据范围

1≤N≤400,

输入样例:

20

输出样例:

36 33 34 33 35 35 34

题解

  • 算法标签:模拟、枚举
#include <iostream>
#include <algorithm>
using namespace std;
int month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int pre_days = 0;
int days[10];//days[0]表示星期天的天数,days[1]表示星期一的天数……
bool isrun(int n){//判断平闰年的函数
    if (n % 400 == 0 || (n % 4 == 0 && n % 100 != 0)) return true;
    return false;
}
int main(){
    int n;
    int k = 0;
    cin >> n;
    for (int i = 1900 ; i <= 1900 + n - 1 ; i ++){
        if (isrun(i)) month[2] = 29;
        else month[2] = 28;
        for (int j = 1 ; j <= 12 ; j ++){
            days[(pre_days + 13) % 7]++;
            pre_days += month[j];
        }
    }
    for (int i = 6 ; i <= 12 ; i ++){
        cout << days[i % 7] << ' ';
    }
    return 0;
}
  • 基本思路:

    ​ 就是以1900年为起点,把之后每个月的13号与1900年1月1日相差的天数记录下来,然后对7取余,整理下顺序输出就ok了。


版权声明:本文为qq_49666427原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。