1.题目:节日-题目
2.思路:
题目看上去有点难,还是用拆分的方法简化,先简后难:
输入:a、b、c、y1、y2,然后保持y1<=y2。输出:年月日,注意格式
计算出从1850年到所求的年月的天数,这样对7取模就可以求得大概是星期几了
根据上一步,进一步推出要求的那天是多少号。(这个过程需要谨慎,推出来先敲代码,再多用测试几组数据核对一下)
检查检查
3.代码
// == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == =
// File Name : ccf真题-201503-3-节日AC代码.cpp
// Author : Sneexy
// Create Time : 2017/03/13 20:55:02
// Update Time : 2017/03/13 20:55:02
// CSDN blog address : http://blog.csdn.net/qq_33810513
// ===============================================================================
#include //title3
#include
using namespace std;
bool leap(int year)
{
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))return true;
return false;
}
int main()
{
int i;
int a, b, c, y1, y2, year, weekday, date = 2, ans_date;//date=2是因为第一天是星期二
int monDay[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
cin >> a >> b >> c >> y1 >> y2;
if (y1 > y2){ i = y1; y1 = y2; y2 = i; } //保持y1<=y2
for (i = 1850; i < y1; i++) //
{
if (leap(i))date += 366;
else date += 365;
}
for (year = y1; year <= y2; year++) //判断每一年
{
// 1.将要判断的日期精确到月
for (i = 1; i < a; i++) date += monDay[leap(year)][i];
weekday = date % 7; //weekday:本年度第一天是星期几;weekday=0表示星期日
c = c % 7;
if (weekday <= c)ans_date = (b - 1) * 7 + (c - weekday + 1); //求第b个星期c应当是几号
else ans_date = (b - 1) * 7 + (c + 7 - weekday + 1);
// 2.判断是否符合条件,并据此输出
if (ans_date <= monDay[leap(year)][a])printf("%4d/%02d/%02d\n", year, a, ans_date);
else cout << "none\n";
// 3.为下一年的日期数累加
for (i = a; i <= 12; i++)date += monDay[leap(year)][i];
}
return 0;
}
/*
笔记:
1.判断每一年的for循环内部,在for循环开头每个月的date要增长,但是到最后却还要+365或366,导致日期不对
修改方式:最后的date增长按剩下的月份来
2.测试数据 3 2 5 2008 2015 每一次都输出的第二个周二。输出weekday发现每次计算的weekday都是对的。
那么一定是weekday和c的比较后给ans_date复制的公式出错了,也懒得计算了,因为发现输出都比日历的前了一天,就在ans_date后面+1了
3.测试数据:
5 2 7 2014 2015
3 2 5 2008 2015
5 2 7 2014 2017
通过5 2 7 2014 2017数据输出weekday和c,//cout << "weekday: " << weekday << endl << "c: " << c << endl;//test line
发现weekday和c的相对关系是对的,只是weekday算出来不对,于是查找weekday的计算的错误
啦啦啦,发现,date=2是1850年的,所以1850到y1这段的date没有加呢
*/
4.注意:
——推导所求的年月的第一天,要计算好
①每一年的天数:通过平年365天,闰年366天。
② 前面的月份对应天数,用二维数组存放平闰年的每月的天数
③根据当月第一天的星期几,计算第b个星期c的天数,用(b - 1)*7 + (c + 7 - weekday +1) 表示,计算和验证出来的。
——调试时通过观察weekday和c的值是否正确,来判断什么部分出错了。