算法提高 日期计算
算法提高 日期计算
时间限制:1.0s 内存限制:256.0MB
问题描述
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
输入只有一行
YYYY MM DD
YYYY MM DD
输出格式
输出只有一行
W
W
数据规模和约定
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
把2011,11,11当做中间值,看输入的日期距离2011,11,11有多少天,然后判断星期几。
本来以为做不对,结果第一遍就通过了。
#include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> #include <algorithm> #include <cstdlib> #define for(i,x,n) for(int i=x;i<n;i++) #define ll long long int #define INF 0x3f3f3f3f #define MOD 1000000007 #define MAX_N 50005 using namespace std; int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年365 int days2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年366 bool judge(int a){ if(a%4==0&&a%100!=0||a%400==0){ return true; }else{ return false; } } int cal(int y,int m,int d,int y2,int m2,int d2){ int day=0; if(y<y2){ for(i,y,y2){ if(judge(i)){ day+=366; }else{ day+=365; } } int t=0; if(judge(y)){ for(i,1,m){ t+=days2[i]; } t+=d; }else{ for(i,1,m){ t+=days[i]; } t+=d; } day-=t; if(judge(y2)){ for(i,1,m2){ day+=days2[i]; } day+=d2; }else{ for(i,1,m2){ day+=days[i]; } day+=d2; } }else if(y==y2&&m<m2){ if(judge(y)){ for(i,m,m2){ day+=days2[i]; } day-=d; day+=d2; }else{ for(i,m,m2){ day+=days[i]; } day-=d; day+=d2; } }else if(y==y2&&m==m2&&d<d2){ day+=(d2-d); } if(y2==2011&&m2==11&&d2==11){ day%=7; if(day>4){ return 7+(5-day); }else{ return 5-day; } }else{ day%=7; if(day<=2){ return 5+day; }else{ return (5+day)-7; } } } int main() { //freopen("data.txt", "r", stdin); //freopen("data.out", "w", stdout); int y,m,d; scanf("%d %d %d",&y,&m,&d); if(y<2011||y==2011&&m<11||y==2011&&m==11&&d<11){ int t=cal(y,m,d,2011,11,11); printf("%d\n",t); }else if(y==2011&&m==11&&d==11){ printf("5\n"); }else if(y>2011||y==2011&&m>11||y==2011&&m==11&&d>11){ int t=cal(2011,11,11,y,m,d); printf("%d\n",t); } //fclose(stdin); //fclose(stdout); return 0; }