资源限制
时间限制: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