【问题标题】:to find how many times a number occurs in two situations找出一个数字在两种情况下出现的次数
【发布时间】:2021-12-06 07:33:51
【问题描述】:

Q) 邻居 m 和 n 在新年订购外卖。在此之后,他们以固定的时间间隔订购。编写一个 python 程序来找出 1 月同一天订购的天数。

例如:如果1月1日之后每2天下单m单,1月1日之后每3天下单n单,那么他们当天下单的次数是6(包括1月1号)

我试过这个。

while 循环中的 c1 和 c2 将给出他们订购外卖的日期。我打算将 c1 和 c2 的所有值添加到两个单独的列表中并进行比较??我不确定这是否可能,如果这是错误的代码。我不知道该怎么做。请有人帮忙

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)

【问题讨论】:

    标签: python list for-loop while-loop range


    【解决方案1】:

    注意。下面的解决方案是高效,您的代码中不需要超过 31 次迭代(实际上不超过 31//3)。测试所有日期组合是没有用的,并且会导致您的代码无法扩展。

    这很容易使用推导式/生成器解决。

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

    您可以通过以下方式度过那些日子:

    [day+1 for day in range(31+1) if not (day%2 or day%6)]
    
    # output: [1, 7, 13, 19, 25, 31]
    

    注意。如果dayx 的倍数,则day%x 返回0,因此当day 同时是26 的倍数时,not (day%2 or day%6) 为真。

    但是,您很快意识到您不需要整天测试,只需测试最大乘数的那些:

    [day+1 for day in range(0, 31+1, 6) if not (day%2 or day%6)]
    
    # output: [1, 7, 13, 19, 25, 31]
    

    如果你只想要天数:

    sum(1 for day in range(0, 31+1, 6) if not (day%2 or day%6))
    
    # output: 6
    

    【讨论】:

      【解决方案2】:
      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 开始计数

      【讨论】:

      • 此解决方案的复杂性呈二次方增加,您不必获取所有天数组合。
      【解决方案3】:

      首先,要更正您的代码,您应该知道= 不会将项目添加到list。它只是重新编写它。所以,这是你的代码的正确方式:

      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)
      

      但是我认为有更好的方法来解决这个问题。如您所见,他们都订购的天数是mnLCM,其multiples 小于31。所以代码会是这样的:

      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)
      

      【讨论】:

      • 此解决方案的复杂性呈二次方增加,您不必获取所有天数组合。
      • @mozway 是在谈论我的解决方案还是提问者的解决方案?无论如何,最大值是 31。所以这真的是个问题吗?
      • 我认为在顶部代码中,count 应该设置为 1 而不是 0
      • @students no count = 0 是对的。问题出在range()。当您调用range(1,31) 时,它实际上从1 计数到30 并忽略31。我编辑我的代码。
      • @Shireen 哦,好的,谢谢
      【解决方案4】:

      创建两个集合。一个具有开始日期和附加值,直到并包括该月的最后一天。第二个类似于第一个,但增加了 3。然后您可以对两个集合执行按位 and 并计算结果集的长度。虽然相当迟钝,但您可以在一行代码中完成:

      print(len({i for i in range(0, 31, 3)} & {i for i in range(0, 31, 2)}))
      

      【讨论】:

        猜你喜欢
        • 2010-11-08
        • 2017-07-26
        • 2020-09-17
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        相关资源
        最近更新 更多