既约分数

题目

如果一个分数的分子和分母的最大公约数是 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象,这个分数称为既约分数。

例如 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象_02, 都是既约分数。

请问,有多少个既约分数,分子和分母都是 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 到 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_编程语言_04 之间的整数(包括 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 和 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_编程语言_04)?


最大公约数,枚举求解

这题若不记得系统自带的库已实现了求两个数的最大公约数,自己定义函数进行求解时间复杂度会较高。

不论记不记得,有一点也是可以理解的,就是尽量的压缩枚举的空间,这里直接上代码和注释,如下:

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)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 千米。如果某天是周一或者月初(蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 日),为了激励自己,小蓝要跑 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_Python_09 千米。如果同时是周一或月初,小蓝也是跑 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_Python_09 千米。

小蓝跑步已经坚持了很长时间,从 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_Python_11 年 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 月 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 日周六(含)到 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_编程语言_04 年 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_编程语言_15 月 蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_日期对象 日周四(含)。请问这段时间小蓝总共跑步多少千米?


“日期”对象

这里主要考查对编程语言基本的内置模块的掌握以及一点编程语言特性。对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对象的属性

运行结果

蓝桥杯备战日志(Python)4-既约分数&跑步锻炼(最大公约数&日期对象)_最大公约数_17


本题的代码如下:

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-货物摆放(枚举、因子分解)​