C++描述 1341. 十三号星期五
大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页
本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!
若需联系博主,可以联系本人微信:qiguanjie2015
题目
十三号星期五真的很不常见吗?
每个月的十三号是星期五的频率是否比一周中的其他几天低?
请编写一个程序,计算 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
题解思路
采用模拟法,从1900年1月1日开始,每过一天,记录周几,如果是当月13号,则记录13号是周几。
算法实现
#include<iostream>
using namespace std;
int n;
int temp = 0;// 当前周几
int month[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int ans[7] = {0};
int check(int y,int m){
if(m != 1)
return 0;
if((y % 4 == 0 && y % 100 !=0) || y % 400 == 0)
return 1;
else
return 0;
}
int main(){
cin >> n;
// 模拟法
for(int i = 0 ; i < n; i ++){
// 年
int year = 1900 + i;
for(int j = 0; j < 12; j++){
// 月
for(int k = 0; k < month[j] + check(year,j); k++){
if(k == 12){
// 13号时
ans[temp]++;
}
// 更新当前周几
temp = (temp + 1) % 7;
}
}
}
// 注意输出是 六、日、1 2 3 4 5的顺序
cout << ans[5] << " " << ans[6] << " " << ans[0] << " " << ans[1] << " " << ans[2] << " " << ans[3] << " " << ans[4] ;
return 0;
}