CCF 2015-03-3 节日

本文介绍了一个用于计算指定年份间特定月份第几周几号的算法,通过判断闰年和平年,计算每月的天数及每周的具体日期,并提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出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

 

转载于:https://www.cnblogs.com/icode-girl/p/4785308.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值