套用日期模板,进行变式,思想来源:AcWing 3619. 日期 - AcWing
思想:
求出 2012年1月1日到 2012年4月12日的天数day1,再求出2012年1月1日到到给定日期的天数day2;
day2-day1就是2012年4月12日到给定日期之间的天数,最后再对week进行一个映射,就可以求出这一天是星期几了。
Tips:
注意这里对于星期的预处理是:
"Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday","Monday","
而不是:
"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"
因为2012 年 4 月 12 日是星期四,其中,2012年1月1日到2012 年 4 月 12 日是104天,
假设题目输入的是4月13日,那么2012年1月1日到2012 年 4 月 13 日是105天。
,如果按照正常星期模拟的话,那么会输出 "Monday",但是题目告诉了我们 4 月 12 日是"Thursday",因此4 月 13 日肯定是"Friday"
code
#include<bits/stdc++.h>
using namespace std;
const int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
string week[7]={"Thursday","Friday","Saturday","Sunday","Monday","Tuesday","Wednesday",};
int is_leap(int y)
{
if(y%4==0&&y%100||y%400==0)return 1;
return 0;
}
int get_day(int y,int m)
{
if(m==2)return 28+is_leap(y);
return months[m];
}
int get_allday(int y,int m,int d)
{
int res=0;
res+=is_leap(y);
for(int i=0;i<m;i++) res+=get_day(y,i);
return res+d;
}
int main()
{
int y=2012,m=0,d=0;
cin>>m>>d;
//求1.1到4.12的天数
int day1=get_allday(2012,4,12);
int day2=get_allday(y,m,d);
//检验日期是否正确
//cout<<day1<<" "<<day2<<endl;
cout<<week[(day2-day1)%7]<<endl;
return 0;
}