【题目链接】
【题目考点】
1. 取模运算
【解题思路】
在以下描述中,星期的数值为0表示星期日,1表示星期一,…,6表示星期六。
考虑这一年第x天是星期几。
假如1月1日是星期w,这一年第0天为星期w-1。星期编号每过7天为一个周期,第0天,第7天,…,第7的倍数天的星期都是一样的,都是w-1。
如果
x
/
7
=
m
.
.
.
.
.
.
d
x/7 = m ...... d
x/7=m......d,那么
x
=
7
∗
m
+
d
x = 7*m+d
x=7∗m+d且
0
≤
d
<
7
0 \le d < 7
0≤d<7,第x天的星期为星期w-1再向后数d天。
如果
w
−
1
+
d
w-1+d
w−1+d为7,那么该值应该变为0,表示星期日。
如果
w
−
1
+
d
w-1+d
w−1+d为8,那么该值应该变为1,表示星期一。
因此第x天的星期为
(
w
−
1
+
d
)
%
7
(w-1+d)\%7
(w−1+d)%7。
在括号里加上7的倍数后,结果不会改变,
(
w
−
1
+
d
)
%
7
=
(
w
−
1
+
7
∗
m
+
d
)
%
7
=
(
w
−
1
+
x
)
%
7
(w-1+d)\%7=(w-1+7*m+d)\%7 = (w-1+x)\%7
(w−1+d)%7=(w−1+7∗m+d)%7=(w−1+x)%7。
因此这一年第x天是星期
(
x
+
w
−
1
)
%
7
(x+w-1)\%7
(x+w−1)%7。
先初始化每个月份的天数。从1月13日开始,每次加上当前月份的天数,得到每个月13日是这一年的第几天。通过上式求出该日的星期,看是不是星期五,如果是则输出。
【题解代码】
解法1:
#include <bits/stdc++.h>
using namespace std;
int mon[13];//mon[i]:第i个月的天数
void initMon()//初始化每个月的天数
{
for(int i = 1; i <= 12; i++)
{
if(i == 2)
mon[i] = 28;
else if(i == 4 || i == 6 || i == 9 || i == 11)
mon[i] = 30;
else
mon[i] = 31;
}
}
int main()
{
initMon();
int w, x = 13, a;//x:1月13日是这一年的第13天
cin >> w;
for(int i = 1; i <= 12; ++i)
{
if((x+w-1)%7 == 5)//(x+w-1)%7:一年第x天的星期,星期日为0
cout << i << endl;
x += mon[i];//加上mon[i]后,x为第i+1月13日是这一年的第几天
}
return 0;
}