首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找一个数字在两种情况下发生了多少次

查找一个数字在两种情况下发生了多少次
EN

Stack Overflow用户
提问于 2021-10-19 11:11:45
回答 4查看 82关注 0票数 1

在新年时,邻居m和n点外卖。在此之后,他们按一定的间隔点餐。编写一个python程序,找出两者在一月份同一天订购的天数。

例如:如果m在1月1日后每2天订购一次,在1月1日后每3天订购n次,则它们在同一天订购的次数为6次(包括1月1日)。

我试过这个。

时间循环中的c1和c2会给出他们点外卖的日子。我计划将c1和c2的所有值添加到两个单独的列表中,并将它们进行比较??我不确定这是否可能,如果是,这是错误的代码。我不知道该怎么做。有人帮忙吗?

代码语言:javascript
复制
m=int(input())
n=int(input())
c1=1
c2=1
count=0
while c1 in range(1,31):
    c1=c1+m
    l1=[1,c1]
while c2 in range(1,31):
    c2=c2+n
    l2=[1,c2]
for x in l1:
    for y in l2:
        if x==y:
            count=count+1
        print(count)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-10-19 11:42:26

代码语言:javascript
复制
m=int(input())
n=int(input())
c1=1
c2=1
l1=[]
l2=[]
count=1
while c1< 32:
    
    c1=c1+m
    l1.append(c1)
    
while c2< 32:
    c2=c2+n
    if c2 in l1:
        l2.append(c2)
count+=len(l2)
print(count)

由于1月1日在任何时候都很常见,所以我从1开始计数。

票数 1
EN

Stack Overflow用户

发布于 2021-10-19 11:25:36

注意:下面的解决方案是高效的__,您的代码中不需要超过31次迭代(实际上不超过31/3)。测试所有的日子组合是无用的,并将导致您的代码是不可伸缩的。

使用理解/生成器很容易解决这一问题。

它们在一起订购的天数都是步骤的倍数(从0开始计算)。

你可以用:

代码语言:javascript
复制
[day+1 for day in range(31+1) if not (day%2 or day%6)]

# output: [1, 7, 13, 19, 25, 31]

注意:day%x返回0如果dayx__的倍数,那么当day同时是26__的倍数时,not (day%2 or day%6)是True。

然而,你很快意识到,你不需要测试所有的日子,只有那些最大的乘数:

代码语言:javascript
复制
[day+1 for day in range(0, 31+1, 6) if not (day%2 or day%6)]

# output: [1, 7, 13, 19, 25, 31]

如果你只想数数天数:

代码语言:javascript
复制
sum(1 for day in range(0, 31+1, 6) if not (day%2 or day%6))

# output: 6
票数 1
EN

Stack Overflow用户

发布于 2021-10-19 11:47:35

首先,要更正代码,您应该知道=没有向list添加项。它只是重写了它。因此,这是正确的代码方式:

代码语言:javascript
复制
m=int(input())
n=int(input())
c1=1
c2=1
count=0
l1 = []
l2 = []
while c1 in range(1,32):
    c1=c1+m
    l1.append(c1)
while c2 in range(1,32):
    c2=c2+n
    l2.append(c2)
for x in l1:
    if x in l2:
        count=count+1
print(count)

但是我认为有一个更好的方法来解决这个问题。正如你所看到的,他们所订购的日子都是LCM of mn,以及它的multiples小于31。所以代码应该是这样的:

代码语言:javascript
复制
import math
count = 0
i = 2
lcm = math.lcm(m, n)
while lcm <= 31:
    counter = counter + 1
    lcm = lcm * i
    i = i + 1
print(counter)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69629730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档