資源限制
時間限制: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