hdu 2133 what day it is?

来源:互联网 发布:运行java文件 编辑:程序博客网 时间:2024/05/16 04:44

这道题,我用的是一个公式,也可以不用公式,直接推到也行,1年1月1号是星期一,每个日期都和她进行比较。


公式:

W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D;

Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。公式中的[...]均指只取计算结果的整数部分。算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日.星期是七天一轮回的,7、14、21、28都是7的倍数,但31号特殊除以7 余数是2却不一定是星期二,而要根据前面几天如28号、29号来推算。


注意一下:输入的判断,在这里wa了好久。


#include <iostream>using namespace std;int leap(int y)  //ture 为闰年{      if((y%4==0 && y%100!=0) || y%400==0) return 1;      return 0;  }int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int howday(int y,int m,int d){  int sum(d);  if(leap(y))mon[2]=29;  else  mon[2]=28;  for(int i=1;i<m;i++)   sum+=mon[i];      return sum;}void print(int n){  if(n==1) cout<<"Monday"<<endl;  if(n==2) cout<<"Tuesday"<<endl;  if(n==3) cout<<"Wednesday"<<endl;  if(n==4) cout<<"Thursday"<<endl;  if(n==5) cout<<"Friday"<<endl;  if(n==6) cout<<"Saturday"<<endl;  if(n==0) cout<<"Sunday"<<endl;}int legal( int y, int m, int d ) {    if ( y <= 0 || y >= 10000 || m <= 0 || m >= 13 || d <= 0 || d >= 32 )        return 0;    if ( ( m == 2 && ( leap(y) == 0 ) && d >= 29 ) ||         ( m == 2 && ( leap(y) == 1 ) && d >= 30 ) )        return 0;    if ( (m == 4 || m == 6 || m == 9 || m == 11) && d == 31 )        return 0;    return 1;}int main(){  int y,m,d;  while(cin>>y>>m>>d){        if(!legal(y,m,d)){        cout<<"illegal"<<endl;         continue;        } int w(0);    w=(y-1)+(y-1)/4-(y-1)/100+(y-1)/400+howday(y,m,d);    if(d==31&&w%7==2){    w=(w-1)%7;    print(w+1);continue;       }       w=w%7;    print(w);}return 0;}