蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)
原创
©著作权归作者所有:来自51CTO博客作者Helloyouth的原创作品,请联系作者获取转载授权,否则将追究法律责任
既约分数
题目
如果一个分数的分子和分母的最大公约数是 ,这个分数称为既约分数。
例如 , 都是既约分数。
请问,有多少个既约分数,分子和分母都是 到 之间的整数(包括 和 )?
最大公约数,枚举求解
这题若不记得系统自带的库已实现了求两个数的最大公约数,自己定义函数进行求解时间复杂度会较高。
不论记不记得,有一点也是可以理解的,就是尽量的压缩枚举的空间,这里直接上代码和注释,如下:
import math
n = 2021
count = 0
# 双层遍历,枚举i,j可能的值,并求解最大公约数
for i in range(1,n):
# 这里j直接从i+1开始
for j in range(i+1,n):
if math.gcd(i,j) == 1:
count += 2
print(count+1) # 加上1是因为以上没有遍历到1/1这个既约分数
跑步锻炼
题目
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 千米。如果某天是周一或者月初( 日),为了激励自己,小蓝要跑 千米。如果同时是周一或月初,小蓝也是跑 千米。
小蓝跑步已经坚持了很长时间,从 年 月 日周六(含)到 年 月 日周四(含)。请问这段时间小蓝总共跑步多少千米?
“日期”对象
这里主要考查对编程语言基本的内置模块的掌握以及一点编程语言特性。对Python来说,在datetime这个内置模块中,实现了时间和日期的一些常用操作,掌握一些基本的足以解决类似的题目。
- datetime.date(year,month,day)可创建一个日期对象
- year,month,day,分别表示当前日期的年、月、日
- weekday()返回表示周几的数字(数字从0开始,0表示周一)
- datetime.datetime() 可创建一个时间对象(处理“年月日时分秒”的时间),用法和日期对象类似,但其属性更多
- datetime.timedelta()创建一个时间间隔对象,可与上述时间/日期对象作加减法
- 比赛中,记不清属性的拼写可以使用Python内置函数dir()打印出该对象的所有属性
“日期”相关对象的基本使用:
import datetime
# 日期对象及其常用属性
dateObj = datetime.date(2023,1,30)
print(dateObj.year,dateObj.month,dateObj.day)
print(dateObj.weekday())
# 时间间隔对象
delta = datetime.timedelta(days=3)
print(dateObj + delta)
print(dateObj - delta)
print( dir(datetime.timedelta) ) # dir()方法查看python对象的属性
运行结果
本题的代码如下:
import datetime
km_sum = 0
start = datetime.date(2000,1,1)
end = datetime.date(2020,10,1)
interval = datetime.timedelta(days=1)
while start<=end:
# 今天跑步积累
km_sum += 1
# 周一或者月初多跑1千米
if start.weekday() == 0 or start.day == 1:
km_sum += 1
# 明天
start += interval
print(km_sum)
上一篇:蓝桥杯备战日志(Python)3-货物摆放(枚举、因子分解)