Прошу помочь найти ошибку в циклах и оптимизировать код

"Поступает запрос на одно число (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 шт):

Автор решения: Alexey Trukhanov

Вам не надо в первой функции добавлять вводимое число в список. Вам надо просто оставить проверку на диапазон. Например, вот так:

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):
→ Ссылка