蓝桥杯 日期计算 C++算法提高 HERODING的蓝桥杯之路

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
  输入只有一行
  YYYY MM DD
输出格式
  输出只有一行
  W
数据规模和约定
  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5

解题思路:
这也算是很经典的一道算法题,条件给了2011年11月11日是星期五,那么我们就要往这个日期上面凑,首先写一个函数获取输入年份到2011年的天数,这中间要进行闰年的判断,然后获取输入的那一年的天数,与输入年份加起来或者相见(看年份是比2011大还是小),这个时候得到的是天数,然后根据题目给的条件,和7取余算出最后的星期,代码如下:

#include
#include
using namespace std;
 
bool leap(int year)//判断是否是闰年 
{
	if(year % 4 == 0 && year % 100 != 0)
		return true;
	if(year % 400 == 0){
		return true;	
	} 
	return false;
} 
 
int getYD(int year)//获取天数 
{
	int sum = 0;
	int i;
	if(year <= 2011)
	{
		for(i = year; i < 2011; i ++)
		{
			if(leap(i))
			sum += 366;
			else
			sum += 365;	
		}
	}
	if(year > 2011)
	{
		for(i = 2011; i < year; i ++)
		{
			if(leap(i))
			sum += 366;
			else
			sum += 365;
		}
	}
	return sum;
}
 
int getMD(int year,int mon,int day)
{
	int i;
	int sum = 0;
	for(i = 1; i < mon; i ++)
	{
		if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
		sum +=31;
		if(i == 4 || i == 6 || i == 9 || i == 11 )
		sum += 30;
		if(i == 2 && leap(year))
		sum += 29;
		if(i == 2 && !leap(year))
		sum += 28;
	}
	sum = sum + day - 1;
	return sum;
}
 
 
 
int main()
{
	int year, mon, day, sum;
	while(cin >> year >> mon >> day)
	{
		sum = getYD(year);
		//cout<
		if(year < 2011)
		{
			sum = sum - getMD(year, mon, day);
			//cout<
			cout << (sum % 7 == 6 ? 7 : abs(6 - (sum % 7))) << endl;
		}
		else
		{
			sum = sum + getMD(year, mon, day);
			//cout<
			cout << ((6 + (sum % 7)) > 7 ? ((6 + (sum % 7)) % 7) : (6 + (sum % 7))) << endl;
		}
		
		
	}
	return 0;
}

感谢这位老哥的思路分享:https://blog.csdn.net/wr132/article/details/43539811

你可能感兴趣的:(蓝桥杯)