AcWing寒假每日一题——Day12十三号星期五

十三号星期五

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

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

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

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

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

1900 1900 1900 1 1 1 1 1 1 日是星期一。
在一年中, 4 4 4 月、 6 6 6 月、 9 9 9 月、 11 11 11 月每个月 30 30 30 天, 2 2 2月平年 28 28 28 天,闰年 29 29 29 天,其他月份每个月 31 31 31天。
公历年份是 4 4 4 的倍数且不是 100 100 100 的倍数的年份为闰年,例如 1992 1992 1992 年是闰年, 1990 1990 1990 年不是闰年。
公历年份是整百数并且是 400 400 400 的倍数的也是闰年,例如 1700 1700 1700年, 1800 1800 1800年, 1900 1900 1900年, 2100 2100 2100年不是闰年, 2000 2000 2000年是闰年。
输入格式
共一行,包含一个整数 N N N

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

数据范围
1 ≤ N ≤ 400 1≤N≤400 1N400
输入样例:

20 20 20

输出样例:

36 36 36 33 33 33 34 34 34 33 33 33 35 35 35 35 35 35 34 34 34

分析: 直接套公式
基姆拉尔森公式: W = ( d + 2 ∗ m + 3 ∗ ( m + 1 ) / 5 + y + y / 4 − y / 100 + y / 400 + 1 ) W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 W=(d+2m+3(m+1)/5+y+y/4y/100+y/400+1)

代码:

#include <bits/stdc++.h>
using namespace std;
int weekday[7],n;
int week(int y,int m,int d){
    
    
    if(m==1||m== 2) m+=12,y--;
    return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
}
int main(){
    
    
    int i,j;
    cin>>n;
    for(i=1900;i<=1900+n-1;i++){
    
    
        for(j=1;j<=12;j++){
    
    
            int w=week(i,j,13);
            weekday[w]++;
        }
    }
    for(i=6;i<=12;i++) cout<<weekday[i%7]<<" ";
}

猜你喜欢

转载自blog.csdn.net/messywind/article/details/112909495