输出y1到y2年之间的每一年的a月份的第b个周c。感觉像是一个恶心的模拟。更像一个很恶心的小学奥赛题。

题目: http://115.28.138.223/view.page?gpid=T25

考试的时候。我猜我是做不出来的。感觉这个代码的函数用的太机智了。某人智商堪忧丫。。。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;

int run(int year) {  // 判断是否是闰年。
   if (year % 400 == 0) return 1;
   else if (year % 100 != 0 && year % 4 == 0) return 1;
   else return 0;
}

int days (int leap, int month) { // 判断这一年的1月到month月开始一共有多少天。这个函数好机智有木有。
   switch (month) {
       case 1: return 0;
       case 2: return 31;
       case 3: return leap ? 60 : 59;
       case 4: return leap ? 91 : 90;
       case 5: return leap ? 121 : 120;
       case 6: return leap ? 152 : 151;
       case 7: return leap ? 182 : 181;
       case 8: return leap ? 213 : 212;
       case 9: return leap ? 244 : 243;
       case 10: return leap ? 274 : 273;
       case 11: return leap ? 305 : 304;
       case 12: return leap ? 335 : 334;
   }
}

int monthDays(int leap, int temp) { // 判断当年的temp月有多少天。
   switch (temp) {
     case 1:
     case 3:
     case 5:
     case 7:
     case 8:
     case 12:
         return 31;
     case 4:
     case 6:
     case 9:
     case 10:
     case 11:
        return 30;
     case 2:
        return leap ? 29 : 28;
   }
}

int main() {
     int month, week, day, y1, y2;
    while(cin >> month >> week >> day >> y1 >> y2) {
      int leapCount = 0;
      for (int i=1850; i<y1; ++i) {
         if (run(i) == 1) leapCount++;
      }
      for (int i=y1; i<=y2; ++i) {
         // 对于我这种小学数学没学好的人来说。。。下面的计算太难了。。
         int totDay = (i-1850)*365 + leapCount + days(run(i), month); // 从1850年开始到当年的这个月开始一共有多少天。
         int weekDay= totDay%7 + 2;  //当年的这个月开始时周几。
         int weekCount = day < weekDay ? 1 : 2; //需要跨过几个周。如果day>weekDay。说明计数周又可以减少一个。基数是1。因为是第几周的周几。所以跨过week-1就好了。
         int ans = 8-weekDay + (week - weekCount)*7 + day;
         if (ans <= monthDays(run(i), month)) // 如果这一天在这个月存在的话。输出。
         {
             cout << i << '/';
             if (month < 10) cout << "0";
             cout << month << '/';
             if (ans < 10) cout << "0";
             cout << ans << endl;
         }
         else cout << "none\n";
         if (run(i) == 1) leapCount++;  // 开始这里忘记了。!!!
      }
    }
    return 0;
}
View Code

 

posted on 2015-09-06 13:37  小小八  阅读(302)  评论(0编辑  收藏  举报