Есть следующее условие: Алгоритм вычисления значения функции 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) чётные. 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)) была чётной. Например: 234 - не подходит, так как содержит цифру 3 222 - подходит, так как каждая цифра кратна 2 Code 234 - не подходит, так как содержит цифру 3 222 - подходит, так как каждая цифра кратна 2 Я написал следующий код, который полученные числа (результат работы функции f(x) на промежутке от 1 до 1000) разбивает на массив чисел. Вот так будет нагляднее: Красным, как вы уже поняли, обозначена разбивка, теперь нужно каждое число из массива проверить на делимость, и если все цифры делятся на 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) 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) Не понимаю, почему ошибка? Разве не входит в границы массива? Как можно по-другому организовать проверку каждой цифры на четность, ибо у меня нет пока других идей?
oriole, нужно пройтись по каждому индексу. Убрал ту строчку "del list_int[y]". Отлично, появился ответ: 2. А правильный ответ: 16...
Decoy4298, убрал строчку, но ответ выдает неправильный, где-то в коде накосячил. Ответ: 2, а должно быть 16.
Хз зачем все эти сложности, вот моё решение проверки всех цифр числа на чётность с тестом: def check(value): digits = [int(d) for d in str(value)] return all(d % 2 == 0 for d in digits) 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: valids = [val for val in range(1, 1001) if check(val) is True] 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))) 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)))