A类月B类月问题

该博客介绍了如何通过Python计算给定时间段内A类月(第一个工作日为周一)和B类月(最后一个工作日为周五)的数量。博主详细解析了问题的关键点,包括确定一个月的第一天和最后一天是星期几,以及判断闰年的方法。通过编写代码实现了功能,并展示了运行结果。
摘要由CSDN通过智能技术生成

文章目录

  • 一、问题描述
  • 二、破题关键
  • 三、前置知识
  • 四、代码实现
  • 总结

一、问题描述

每月工作日只考虑周末情况,即只有周六、周日放假。

每月第一个工作日如果是星期一则该月是A类月,


每月最后一个工作日如果是星期五则该月是B类月。

一个月可能是A类月也可能是B类月。

如2006 10 2是该月第一个工作日为星期一是A类月,

如2006 9 29是该月最后一个工作日为星期五则是B类月。

输入一个时间段如:2006 6 2006 6(闭区间),

求出该时间段内的A类月和B类月数量。python或c/c++。

这个问题,是我今早偶然在CSDN内看到的。

二、破题关键

1、已知,周六周日休息,如果,一个月的第一天是星期六或星期日,或星期一,那么第一个工作日必然周一,也即A类月;

2、同样地,如果一个月的最后一天是星期五或星期六或星期日,那么最后一个工作日必然是周五,也即B类月。

3、或许,这对某些大佬而言是废话,但对我而言,却有一定难度,希望不要嫌我啰嗦。

三、前置知识

1、如何知道一个月的第一天与最后一天是星期几?

#这里要引入python中的一个模块,calendar
import calendar
year = 2022 
month = 1
day = 1
week = calendar.weekday(year,month,day)
print(week)

运行结果如下:

事实上那天是星期六,我的猜测是这是西方人的习惯,不过作为中国人,咱们还是要按照自己的来,于是,我们在此基础上加 1 便好!

2、一个月的第一天是1,但最后一天却不尽相同,有30、31、28、29于是,知道一个月有多少天便显得尤为必要。

众所周知:

1、3、5、7、8、10、12      有31天

4、6、9、11 有30天

2 平年有28天,闰年有29天

如何判断闰年:

普通闰年:能被4整除但不能被100整除的年份为普通闰年。
世纪闰年:能被400整除的为世纪闰年。

#为了程序设计的简便,我们定义一个函数,返回天数 
def func(year,month):
     if month in {1, 3, 5, 7, 8, 10, 12}:
         return 31
     elif month in {4, 6, 9, 11}:
         return 30
     elif month == 2:
         if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
             return 29
         else:
             return 28

 四、代码实现

import calendar

str = input()

str_int = list(map(int,str.split(' ')))

start_year = str_int[0]
start_month = str_int[1]

end_year = str_int[2]
end_month = str_int[3]

A = 0
B = 0

def func(year,month):
    if month in {1, 3, 5, 7, 8, 10, 12}:
        return 31
    elif month in {4, 6, 9, 11}:
        return 30
    elif month == 2:
        if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
            return 29
        else:
            return 28

while True:
    num_start = calendar.weekday(start_year,start_month,1) + 1
    num_end = calendar.weekday(start_year,start_month,func(start_year,start_month)) + 1

    if num_start == 6 or num_start == 7 or num_start == 1:
        A += 1
    if num_end == 6 or num_end == 7 or num_end == 5:
        B += 1
    if start_year == end_year and start_month == end_month:
        break
    start_month += 1
    start_month = start_month if start_month <= 12 else 1
    start_year = start_year if start_month != 1 else start_year + 1

print(f"A类月有{A}天,B类月有{B}天")

结果展示: 

 

总结


例如:以上就是今天要讲的内容,如有不妥,还望批评指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值