第四次CCF软件能力认证C题-节日 题型:日期模拟

48 阅读1分钟

3214. 节日 - AcWing题库

#include<bits/stdc++.h>
using namespace std;

const int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap(int y)
{
	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
		return 1;
	return 0;
}
int get_days(int y,int m)
{
	if (m == 2)return months[m] + is_leap(y);
	return months[m];
}

int a, b, c, ya, y2;
int main()
{
	cin >> a >> b >> c >> ya >> y2;

	int days = 0;
	
    //从1850年1月1号开始枚举到y2
	for (int y = 1850; y<= y2; y++)
	{
		for (int m = 1; m<= 12; m++)  //枚举每一年的每个月
		{
			if (y >= ya && m == a)  //如果年份相同并且月份相同就找一下这个月的第b个星期的星期c天
			{
				int w = (1 + days) % 7;  //求一下当前day是这个月的星期几    1850年1月1日是星期二,下标从1开始
				int cnt = 0;

				//求一下当前day位于本月的第几个星期
				for (int d = 1; d <= get_days(y, m); d++)
				{
					if (w == c - 1) //星期的下标从0开始,所以要-1,如星期七的下标是6
					cnt++;  //星期c的个数++

					if(cnt==b)
					{
						printf("%04d/%02d/%02d\n",y,m,d);
						break;
					}
					w = (w + 1) % 7;  //每过一天,星期就要往后错一位
				}
				if (cnt < b)  //枚举完这个月还是不够第b个星期,说明这一月根本不存在第b个星期,输出none
				{
					puts("none");
				}	
			}	
			days += get_days(y,m);
		}
	}

	return 0;
}

image.png