关于日期的处理 usaco Friday the Thirteeth

来源:互联网 发布:基于单片机的智能床 编辑:程序博客网 时间:2024/06/14 14:36
     关于日期的处理无非是要正确处理闰年和闰月的问题。今天所做的那个题
是这样的,告诉你1900年的1月1日是星期一,问从这天起到以后1900+N-1的12
月31日为止,每一个月的十三号分别落在一个星期内每一天中的的次数。刚做这
道题的时候,我先计算从第一天到最后一天的所有的天数,然后再来推13号落在
星期几上。其实这是完全没有必要的,因为在算完所有的天数以后,我还是得要
从第一个月开始,一个月一个月的推,由于相邻的两个月的13号这间恰好相差一
个月的时间,所以规律很明显就出来了。

具体代码如下:
  1. /*
  2. ID:zhangwenjun32
  3. PROG:friday
  4. LANG:C++
  5. */
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9. using namespace std;
  10. int N;
  11. int an[7];
  12. int loopyear(int year)
  13. {
  14.        if((year%4==0&&year%100!=0)||year%400==0) return 366;
  15.        else return 365;
  16. }
  17. int ismonth(int month,int year)
  18. {
  19.         switch(month)
  20.         {
  21.               case 2:if(loopyear(year)==366) return 29;
  22.                      else return 28;
  23.               case 4:
  24.               case 6:
  25.               case 9:
  26.               case 11:return 30;
  27.               default:return 31;
  28.         }
  29. }
  30. int main()
  31. {
  32.       ifstream fin("friday.in");
  33.       ofstream fout("friday.out");
  34.       fin>>N;
  35.       memset(an,0,sizeof(an));
  36.       int year = 1900;
  37.       int flag=0;
  38.       flag = (an[0]+12)%7;
  39.       an[flag]++;
  40.       for(int i=0;i<N;++i)
  41.       {
  42.             //sumdays+=loopyear(year+i);
  43.             for(int j=1;j<=12;++j)
  44.             {
  45.                  int m_days = ismonth(j,year+i);
  46.                  flag = (flag+m_days)%7;
  47.                  an[flag]++;
  48.                  //cout<<month<<" "<<m_days<<" "<<flag<<endl;
  49.                  //cout<<month<<endl;
  50.                  m_days = ismonth(j,year+i);
  51.             }
  52.       }
  53.       an[flag]--;
  54.       int k=5;
  55.       for(int i=0;i<7;++i)
  56.       {
  57.             if(i==0)
  58.             fout<<an[k];
  59.             else fout<<" "<<an[k];
  60.             k = (k+1)%7;
  61.       }
  62.       fout<<endl;
  63.       return 0;
  64. }

原创粉丝点击