Python编程求助:计算两位邻居1月内同一天点外卖的次数
解决两人1月内同一天点外卖次数的问题
先帮你梳理下原有代码里的几个核心问题:
- 列表赋值逻辑错误:你每次循环都把
l1重新赋值为[1,c1],这意味着列表永远只会保留两个元素,根本存不下所有点单日期。应该用append()方法来持续添加新日期。 - while循环条件不合理:
c1 in range(1,31)的判断逻辑有问题——range(1,31)只包含1到30的整数,会漏掉1月31日;而且这个判断是检查当前c1是否在范围内,不是判断下一次加间隔后是否超出范围,会导致部分日期漏加。 - 初始日期处理重复:你在列表里手动加了1,但循环里又从1开始累加,容易造成逻辑混乱,应该统一用循环来生成所有日期。
方法一:生成日期列表后求交集
你的核心思路是可行的,只要修正上述问题即可。我们可以先生成两人所有的点单日期,再通过集合求交集来统计次数:
m = int(input()) n = int(input()) # 生成用户m的所有点单日期(包含1月1日) dates_m = [] current = 1 while current <= 31: dates_m.append(current) current += m # 生成用户n的所有点单日期(包含1月1日) dates_n = [] current = 1 while current <= 31: dates_n.append(current) current += n # 计算两个日期列表的交集长度,就是同一天点单的次数 count = len(set(dates_m) & set(dates_n)) print(count)
代码说明:
- 从1月1日开始,每次累加间隔天数,直到日期超过31就停止,把所有符合条件的日期存入列表。
- 将列表转为集合后用
&求交集,再取交集的长度,这种方式比嵌套循环比对效率更高,代码也更简洁。
方法二:数学方法(最小公倍数)
如果日期范围很大,生成列表的方法效率会降低,这时候可以用数学思路优化:
两人第一次同一天点单是1月1日,之后每次相遇的间隔是m和n的最小公倍数(LCM)。我们只需要计算从1开始,每次加最小公倍数,直到不超过31的数有多少个。
计算最小公倍数可以用公式:LCM(a,b) = a * b // GCD(a,b)(GCD是最大公约数),Python的math模块提供了现成的gcd函数:
import math m = int(input()) n = int(input()) # 计算最大公约数 gcd_val = math.gcd(m, n) # 计算最小公倍数 lcm_val = m * n // gcd_val # 统计符合条件的日期数量:(31-1)除以最小公倍数取整,再加1(包含1月1日) count = (31 - 1) // lcm_val + 1 print(count)
示例验证:
当m=2,n=3时,最大公约数是1,最小公倍数是6。代入公式得(31-1)//6 +1 = 5+1=6,和示例结果完全一致。
内容的提问来源于stack exchange,提问作者students
相关产品推荐
相关产品推荐

