чтобы узнать, сколько раз число встречается в двух ситуациях

#python #list #for-loop #while-loop #range

Вопрос:

Q) соседи m и n заказывают еду на вынос на новый год. после этого они заказывают с фиксированным интервалом. напишите программу на python, чтобы узнать, сколько дней оба будут заказывать в один и тот же день в январе.

например: если m заказов каждые 2 дня после 1 января и n заказов каждые 3 дня после 1 января, количество заказов в один и тот же день равно 6 (включая 1 января).

Я попробовал это.

c1 и c2 в цикле while укажут дни, в которые они заказали еду на вынос. Я планировал добавить все значения 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)
 

Ответ №1:

 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. Эта сложность этого решения возрастает квадратично, вам не нужно получать все комбинации дней.

Ответ №2:

nb. приведенное ниже решение эффективно, вам не нужно иметь в коде более 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]
 

NB. day%x возвращает 0 , если day если кратно x , поэтому not (day%2 or day%6) верно, когда day одновременно кратно 2 и 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
 

Ответ №3:

Во-первых, чтобы исправить свой код, вы должны знать, что = он не добавляет элементы в a 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)
 

НО я думаю, что есть лучший способ решить этот вопрос. как вы видите, дни, которые они оба заказывают LCM m , — это дни и n , и их 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)
 

Комментарии:

1. Эта сложность этого решения возрастает квадратично, вам не нужно получать все комбинации дней.

2. @mozway говорит о моем решении или решении спрашивающего? в любом случае, максимум-31. так это действительно проблема?

3. я думаю, что в верхнем коде количество должно быть равно 1 вместо 0

4. @студенты, нет count = 0 , это правильно. проблема в range() том, что . когда вы звоните range(1,31) , это на самом деле отсчитывается от 1 до 30 и игнорируется 31 . Я редактирую свой код.

5. @Shireen о, хорошо, понял, спасибо

Ответ №4:

Создайте два набора. У одного есть начальный день и дополнительные значения, увеличивающиеся на 2 до последнего дня месяца включительно. Второй похож на первый, но увеличивается на 3. Затем вы можете выполнить побитовое и на двух наборах и подсчитать длину полученного набора. Хотя это довольно тупо, вы могли бы сделать это в одной строке кода, таким образом:

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