【题目链接】
【题目考点】
1. 模拟
【解题思路】
解法1:统计各月天数
- 根据输入的年份确定这一年各个月的天数。
- 统计从第一个输入月份到第二个输入月份的天数,看能否整除7。如果可以,则是相关月,否则不是。
解法2:写日期类
构造日期类,设方法:求下一天的日期。从第一个输入月份的1日不断向后推下一天,直到推导第二个输入月份的1日,看一共经过的天数能否整除7。
【题解代码】
解法1:统计各月天数
#include<bits/stdc++.h>
using namespace std;
int md[13] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
int n, y, m1, m2, td, t;
scanf("%d", &n);
while(n--)
{
scanf("%d %d %d", &y, &m1, &m2);
if(m1 > m2)
t = m1, m1 = m2, m2 = t;//交换m1与m2,保证m1<=m2
if(y%400 == 0 || y%100 != 0 && y%4 == 0)//如果y是闰年
md[2] = 29;//设2月的天数
else
md[2] = 28;
td = 0;//m1月1日到m2月1日的总天数
for(int i = m1; i < m2; ++i)
td += md[i];
if(td % 7 == 0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
解法2:写日期类
#include<bits/stdc++.h>
using namespace std;
struct Date
{
int y, m, d;//年,月,日
Date(){
}
Date(int a, int b, int c):y(a), m(b), d(c){
}
bool isLeap()
{
return y%400 == 0 || y%4 == 0 && y%100 != 0;
}
int getMonthDay()
{
if(m == 2)
return isLeap() ? 29 : 28;
else if(m == 4 || m == 6 || m == 9 || m == 11)
return 30;
else
return 31;
}
void nextDay()
{
d++;
if(d > getMonthDay())
{
d = 1;
m++;
}
}
bool operator != (Date b)
{
return m != b.m || d != b.d;
}
};
int main()
{
int n, y, m1, m2, td;
Date d1, d2;
cin >> n;
while(n--)
{
cin >> y >> m1 >> m2;
if(m1 > m2)
swap(m1, m2);
d1 = Date(y, m1, 1), d2 = Date(y, m2, 1);
td = 0;//m1月1日到m2月1日的总天数
while(d1 != d2)
{
td++;
d1.nextDay();
}
cout << (td%7 == 0 ? "YES" : "NO") << endl;
}
return 0;
}