zoukankan      html  css  js  c++  java
  • CCF 2015-03-3 节日

    输出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
    ";
             if (run(i) == 1) leapCount++;  // 开始这里忘记了。!!!
          }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    阅读《构建之法(第三版)》提出的问题
    职位部门管理系统
    JSON
    hashcode()和equals()方法
    JSF和Facelets的生命周期
    认识applet
    认识ajax
    hello1.java分析
    vue中的防抖和节流
    vue项目搭建
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4785308.html
Copyright © 2011-2022 走看看