文章目录
- 一、问题描述
- 二、破题关键
- 三、前置知识
- 四、代码实现
- 总结
一、问题描述
每月工作日只考虑周末情况,即只有周六、周日放假。
每月第一个工作日如果是星期一则该月是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}天")
结果展示:
总结
例如:以上就是今天要讲的内容,如有不妥,还望批评指正!