【小韦同学@神犇营-USACO1.1.3-黑色星期五】
题目:
描述
13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。
给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
注意,开始今年是一千九百年,不是1990
这里有一些你要知道的:
1、1900年1月1日是星期一.
2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.
3、年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年).
4、以上规则不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年。所以,1700,1800,1900和2100年是平年,而2000年是闰年.
请不要调用现成的函数
请不要预先算好数据(就是叫不准打表)!
输入
一个正整数N
输出
七个在一行且相分开的整数,它们代表13日是星期六、星期日、星期一、…星期五的次数
输入样例1
20
输出样例1
36 33 34 33 35 35 34
题解:
/*********************************************************************
* 题目:神犇营-USACO1.1.3-黑色星期五
* 作者:小韦同学
* 邮箱:weichangying_wcy@163.com
* 题解:
思路:
(1)从1900年1月1日开始数天数,因为1900年1月1日是周一,所以相应的
周几就是累计的天数模7,若模7等于0则为周日,等于1为周一,等于2为周
二、、、等于6为周六。
(2)枚举从1900年1月到所求的年份12月,算每个月的13号累计的天数,用
该天数模7即可。
(3)然后算出每个13号累计的天数?首先从1900年1月13日开始,这个13号
累计的天数是13天,1900年2月13日这天的累计天数是13加上1月份的天数。
故每一个月的13号的累计天数是上一个13号累计天数加上上个月的天数,因
为每个月从1号到13号是固定的,变化的就是从上个月13号到上个月结束这段
时间。,所以其实增加的累计天数就是上个月的天数。
注意:
1°注意计算累计天数和数13号是周几的天数的顺序。
2°记得先输出周六。
*********************************************************************/
#include <iostream>
using namespace std;
// 平年每个月的天数
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[7] = {0};
// 判断是否为闰年,为闰年返回true
bool is_true(int year) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
return true;
}
return false;
}
void count(int n) {
int d = 13; // 1900年1月13日的累计天数
for (int y = 1900; y < 1900 + n; y++) { // 枚举每一年
for (int m = 1; m <= 12; m++) { // 枚举每个月
// 对应的周几加1,注意要先做这个操作,然后再累计天数
day[d % 7]++;
// 当是闰年的时候,2月累计天数加1
if (m == 2 && is_true(y)) d++;
d += month[m]; // 加上当月的天数,到下一个月的13号
}
}
}
int main() {
int n;
cin >> n;
count(n);
cout << day[6]; // 先输出周六的天数
for (int i = 0; i < 6; i++) {
cout << " " << day[i];
}
return 0;
}
我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:weichangying_wcy@163.com