蓝桥杯 日期计算
2016-01-22 23:27
405 查看
算法提高 日期计算
时间限制: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
哎哎,只有80分,总有一组测试数据没过,觉得有时候蓝桥杯的测评系统也挺坑的。这次不是VIP也无法查看到底是哪个坑爹的数据没过。思路还是可以的。
时间限制: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
哎哎,只有80分,总有一组测试数据没过,觉得有时候蓝桥杯的测评系统也挺坑的。这次不是VIP也无法查看到底是哪个坑爹的数据没过。思路还是可以的。
#include<stdio.h> int days[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; int days2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31}; int main() { int y,m,d; while(~scanf("%d%d%d",&y,&m,&d)) { if(y<1599||y>2999||m<1||m>12||d<1||d>31) continue; int flag=0; if(y<=2011) { if(y==2011) { if(m<=11) { if(m==11) { if(d<=11) flag=1; } else flag=1; } } else flag=1; } int sum=0,dd; if(flag) { for(int i=1; i<11; i++) sum+=days[i]; sum+=11; for(int i=2010; i>=y; i--) { if(i%4==0||i%400==0&&i%100!=0) sum+=366; else sum+=365; } if(y%4==0||y%400==0&&y%100!=0) { for(int i=1; i<m; i++) sum-=days2[i]; sum-=d; } else { for(int i=1; i<m; i++) sum-=days[i]; sum-=d; } dd=sum%7; if(dd==5) printf("6\n"); else if(dd==6) printf("7\n"); else printf("%d\n",5-sum%7); } else { if(y==2011) { for(int i=11; i<m; i++) sum+=days[i]; sum+=d; dd=sum%7; if(dd<=2) printf("%d\n",5+dd); else printf("%d\n",dd-2); } else { sum=19+31; for(int i=2012; i<y; i++) { if(i%4==0||i%400==0&&i%100!=0) sum+=366; else sum+=365; } if(y%4==0&&y%100!=0||y%400==0) { for(int i=1; i<m; i++) sum+=days2[i]; sum+=d; } else { for(int i=1; i<m; i++) sum+=days[i]; sum+=d; } dd=sum%7; if(dd<=2) printf("%d\n",5+dd); else printf("%d\n",dd-2); } } } return 0; }