藍橋杯 日期計算 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<iostream>
#include<cmath>
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<<getMD(year,mon,day)<<endl;;
		if(year < 2011)
		{
			sum = sum - getMD(year, mon, day);
			//cout<<sum<<endl;
			cout << (sum % 7 == 6 ? 7 : abs(6 - (sum % 7))) << endl;
		}
		else
		{
			sum = sum + getMD(year, mon, day);
			//cout<<sum<<endl;
			cout << ((6 + (sum % 7)) > 7 ? ((6 + (sum % 7)) % 7) : (6 + (sum % 7))) << endl;
		}
		
		
	}
	return 0;
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章