#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)}))