十三号星期五真的很不常见吗?
每个月的十三号是星期五的频率是否比一周中的其他几天低?
请编写一个程序,计算 N 年内每个月的 13 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。
测试的时间段将会开始于 1900 年 1 月 1 日,结束于 1900+N−1年 12 月 31日。
一些有助于你解题的额外信息:
- 1900 年 1 月 1 日是星期一。
- 在一年中,4 月、6 月、9 月、11 月每个月 30 天,2 月平年 28 天,闰年 29 天,其他月份每个月31天。
- 公历年份是 4 的倍数且不是 100的倍数的年份为闰年,例如 1992 年是闰年,1990 年不是闰年。
- 公历年份是整百数并且是 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;
}