Загрузка...

Trouble with Python Code - Task

Thread in Python created by Бизнесмен Nov 5, 2020. 9120 views

  1. Бизнесмен
    Бизнесмен Topic starter Nov 5, 2020 роскошные услуги 1459 May 19, 2018
    Есть следующее условие:
    Code
    Алгоритм вычисления значения функции 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)) была чётной.

    Например:

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

    Мой код:
    Code
    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]
     
  2. oriole
    oriole Nov 5, 2020 был(а) давно
    не удаляй элементов тогда не будет ошибки
     
    1. Бизнесмен Topic starter
      oriole, нужно пройтись по каждому индексу. Убрал ту строчку "del list_int[y]". Отлично, появился ответ: 2. А правильный ответ: 16...
  3. Decoy4298
    Decoy4298 Nov 5, 2020 217 Feb 18, 2020
    Ты на ходу через del удаляешь элементы, таким промышлять нельзя
     
    1. Бизнесмен Topic starter
      Decoy4298, убрал строчку, но ответ выдает неправильный, где-то в коде накосячил. Ответ: 2, а должно быть 16.
  4. Decoy4298
    Decoy4298 Nov 5, 2020 217 Feb 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 конвертнуть перед работой. (Сразу пофиксил в ф-ции)
    The post was merged to previous Nov 5, 2020
    И получение списка валидных значений в диапазоне 1-1000:
    Python
    valids = [val for val in range(1, 1001) if check(val) is True]
    Upd: фулл решение

    Code
    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)))
     
    1. View previous comments (6)
    2. Decoy4298
    3. Бизнесмен Topic starter
Top
Loading...