You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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月1日开始,每次累加间隔天数,直到日期超过31就停止,把所有符合条件的日期存入列表。
  2. 将列表转为集合后用&求交集,再取交集的长度,这种方式比嵌套循环比对效率更高,代码也更简洁。

方法二:数学方法(最小公倍数)

如果日期范围很大,生成列表的方法效率会降低,这时候可以用数学思路优化:
两人第一次同一天点单是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:07:39