AcWing 1341. 十三号星期五

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

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

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

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

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

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

输入格式

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

输出格式

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

数据范围

1≤N≤400,

输入样例:

20

输出样例:

36 33 34 33 35 35 34

思路: 每次使用(ysum+pre[i]+13)%7得到当前年份当前月13号是星期几(ysum为1900年到当前年份的总天数,pre[i]为当前年份从1月到当前月份的总天数)

#include<iostream>
#include<memory.h>
using namespace std;
int n;
int ans[7]={0};
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int pre[13]={0};
int main(){
    memset(ans,0,sizeof ans);
    cin>>n;
    int y1=1900,y2=1900+n-1,ysum=0;
    while(y1<=y2){
        memset(pre,0,sizeof pre);
        if((y1%4==0 && y1%100!=0) ||  y1%400==0) m[1]=29;
        else m[1]=28;
        for(int i=1;i<=12;i++) {pre[i]=pre[i-1]+m[i-1];}
        //cout<<pre[12]<<endl;
        for(int i=0;i<12;i++){
            ans[(ysum+pre[i]+13)%7]++;
        }
        y1+=1;
        ysum+=pre[12];
    }
    for(int i=0;i<7;i++){
        cout<<ans[(i+6)%7]<<' ';
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wd2ctp88/article/details/112856396