ccf真题-201503-3-节日AC题解

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的值是否正确,来判断什么部分出错了。

发布了48 篇原创文章 · 获赞 21 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_33810513/article/details/61928214
今日推荐