Прошу помочь найти ошибку в циклах и оптимизировать код
"Поступает запрос на одно число (n) диапазон только от 3-20,
и код должен на поступившее число подобрать пары чисел кратные числу (n). Пример: 9 - число из первой вставки 1218273645 - нужный пароль (1 и 2, 1 и 8, 2 и 7, 3 и 6, 4 и 5 - пары; число 9 кратно сумме каждой пары)"
def get_input():
num = []
number = int(input('Введите число от 3х до 20ти: '))
if 3 <= number <= 20:
num.append(number)
else:
print(f'Не верное число: {number}')
return num
def get_shifr(n):
list1 = []
list2 = []
for i in n:
for j in range(1, n):
if i == j:
continue
elif str([j, i]) in list1:
continue
elif i % (i + j) == 0:
list2 += str(i) + str(j)
list1.append([i, j])
return list2
mum = get_input()
print(get_shifr(mum))
Ответы (1 шт):
Вам не надо в первой функции добавлять вводимое число в список. Вам надо просто оставить проверку на диапазон. Например, вот так:
def get_input():
number = int(input('Введите число от 3х до 20ти: '))
if 3 <= number <= 20:
return number
return None
Функция вернет введенное число если оно попадает в диапазон и вернет None если число вне диапазона.
Ошибка во второй функции возникает именно из-за того, что в строке
for j in range(1, n)
ожидается число в качестве второго аргумента, Вы же передаете список.
Изменим список на число, соответственно изменим диапазоны двух циклов, избавимся от вспомагательных списков и соберем строку из подходящих пар.
Дальше останется вызвать обе функции, не забыв сообщить о правильности ввода.
def get_input():
number = int(input('Введите число от 3х до 20ти: '))
if 3 <= number <= 20:
return number
return None
def get_shifr(n):
out = ''
for i in range(1, n):
for j in range(i, n):
if n % (i + j) == 0:
out += str(i) + str(j)
return out
if mum := get_input():
print(get_shifr(mum))
else:
print(f'Не верное число: {mum}')
Есть один вопрос - является ли валидной пара из двух одинаковых чисел, например, при вводе четного числа, две половины этого числа будут валидны или нет? Код выше подразумевает, что да, будут. Если это не так, то диапазон второго цикла надо заменить:
for j in range(i+1, n):