Загрузка...

Проблема с кодом Python - Задача

Тема в разделе Python создана пользователем Бизнесмен 5 ноя 2020. 9118 просмотров

  1. Бизнесмен
    Бизнесмен Автор темы 5 ноя 2020 роскошные услуги 1459 19 май 2018
    Есть следующее условие:
    Код
    Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
    F(n) = n + 3, при n ≤ 18
    F(n) = (n//3)*F(n//3) + n - 12, при n > 18, кратных 3
    F(n) = F(n-1) + n*n + 5, при n > 18, не кратных 3
    Здесь // обозначает деление нацело. Определите количество натуральных значений n из отрезка [1; 1000], для которых все цифры значения F(n) чётные.
    Пишу на Python 2 сутки (по коду увидите), столкнулся с тем, что не могу решить данную задачу.
    Ф-ция у меня написана верно (проверял), а вот условие отбора не получается сделать.
    Нужно, чтобы каждая цифра числа (результат работы ф-ции f(x)) была чётной.

    Например:

    Код
    234 - не подходит, так как содержит цифру 3
    222 - подходит, так как каждая цифра кратна 2
    Я написал следующий код, который полученные числа (результат работы функции f(x) на промежутке от 1 до 1000) разбивает на массив чисел.
    Вот так будет нагляднее:
    [IMG]
    Красным, как вы уже поняли, обозначена разбивка, теперь нужно каждое число из массива проверить на делимость, и если все цифры делятся на 2, то сделать счетчик + 1.

    Мой код:
    Код
    def f(n):
    if n <= 18: return n + 3
    elif (n > 18) & (n % 3 == 0): return (n//3) * f(n//3) + n - 12
    elif (n > 18) & (n % 3 != 0): return f(n-1) + n*n + 5
    else: return n == 0

    chet = 0
    nechet = 0
    count = 0

    for x in range (1, 1000+1):
    list_str = list(str(f(x)))
    list_int = list(map(int, list_str))
    for y in range (0, len(list_int)):
    if list_int[y] % 2 == 0:
    chet += 1
    else:
    nechet += 1

    if chet == len(list_int):
    count += 1

    print(count)
    Не понимаю, почему ошибка? Разве не входит в границы массива? Как можно по-другому организовать проверку каждой цифры на четность, ибо у меня нет пока других идей? [IMG]
     
    5 ноя 2020 Изменено
  2. oriole
    oriole 5 ноя 2020 был(а) давно
    не удаляй элементов тогда не будет ошибки
     
    1. Бизнесмен Автор темы
      oriole, нужно пройтись по каждому индексу. Убрал ту строчку "del list_int[y]". Отлично, появился ответ: 2. А правильный ответ: 16...
  3. Decoy4298
    Decoy4298 5 ноя 2020 217 18 фев 2020
    Ты на ходу через del удаляешь элементы, таким промышлять нельзя
     
    1. Бизнесмен Автор темы
      Decoy4298, убрал строчку, но ответ выдает неправильный, где-то в коде накосячил. Ответ: 2, а должно быть 16.
  4. Decoy4298
    Decoy4298 5 ноя 2020 217 18 фев 2020
    Хз зачем все эти сложности, вот моё решение проверки всех цифр числа на чётность с тестом:
    [IMG]
    Python
    def check(value):
    digits = [int(d) for d in str(value)]
    return all(d % 2 == 0 for d in digits)
    Если число изначально в int, то можно просто в str конвертнуть перед работой. (Сразу пофиксил в ф-ции)
    --- Сообщение объединено с предыдущим 5 ноя 2020
    И получение списка валидных значений в диапазоне 1-1000:
    Python
    valids = [val for val in range(1, 1001) if check(val) is True]
    Upd: фулл решение

    Код
    def F(n):
    if n <= 18:
    return n + 3
    elif n > 18 and n % 3 == 0:
    return n // 3 + F(n // 3)
    elif n > 18 and n % 3 != 0:
    return F(n - 1) + n * n + 5


    def is_even(value):
    return all(d % 2 == 0 for d in [int(d) for d in str(value)])


    evens = [val for val in range(1, 1001) if is_even(F(val)) is True]

    for even in evens:
    print('{} (F = {})'.format(even, F(even)))
     
    5 ноя 2020 Изменено
    1. Посмотреть предыдущие комментарии (5)
    2. Decoy4298
    3. Decoy4298
    4. Бизнесмен Автор темы
Top
Загрузка...