Top.Mail.Ru
Ответы

Решите, пожалуйста, не получается чего-то.

Алгоритм вычисления значения функции F(n), где п - натуральное число, задан следующими соотношениями: F(n) = n*n + 5*n + 4, при п > 30 F(n) = F(n+1) + 3*F(n+4), при чётных n 30
F(n) = 2*F(n+2) + F(n+5), при нечётных n s 30
Определите количество натуральных значений п из отрезка [1; 1000], для которых сумма цифр значения F(n) равна 27.

По дате
По рейтингу
Аватар пользователя
Новичок
12345
 f = [0] * 1001
for i in range(31, 1001): f[i] = i * i + 5 * i + 4
for i in range(30, 0, -1):
  f[i] = [f[i + 1] + 3 * f[i + 4], 2 * f[i + 2] + f[i + 5]][i % 2]
print(sum(sum(map(int, str(v))) == 27 for v in f)) 

Сначала надо вычислить значения от f(31) до f(1000) - в любом порядке, а только после этого вычислять значения от f(30) до f(1) в порядке уменьшения n.

Сумму цифр натурального числа v проще вычислить так: sum(map(int, str(v)))

Аватар пользователя
Просветленный

Для решения задачи необходимо реализовать алгоритм вычисления значения функции F(n) в соответствии с заданными условиями и определить количество натуральных значений n из отрезка [1; 1000], для которых сумма цифр значения F(n) равна 27. Давайте напишем программу на Python, которая решит эту задачу.

1234567891011121314151617181920212223242526272829
 def sum_of_digits(num): 
    return sum(int(digit) for digit in str(num)) 
 
def F(n, memo): 
    if n in memo: 
        return memo[n] 
     
    if n > 30: 
        result = n * n + 5 * n + 4 
    elif n % 2 == 0: 
        result = F(n + 1, memo) + 3 * F(n + 4, memo) 
    else: 
        result = 2 * F(n + 2, memo) + F(n + 5, memo) 
     
    memo[n] = result 
    return result 
 
# Создаем словарь для хранения уже вычисленных значений F(n) 
memo = {} 
 
# Подсчитываем количество натуральных значений n из отрезка [1; 1000], 
# для которых сумма цифр значения F(n) равна 27 
count = 0 
for n in range(1, 1001): 
    if sum_of_digits(F(n, memo)) == 27: 
        count += 1 
 
print(count) 
 

В данном коде используется функция sum_of_digits, которая вычисляет сумму цифр числа. Функция F реализует вычисление значения функции F(n) согласно заданным условиям с использованием мемоизации для оптимизации производительности. Затем в цикле от 1 до 1000 проверяется, равна ли сумма цифр значения F(n) 27, и если да, то увеличивается счётчик count. В конце программа выводит количество таких значений.

или в более коротком коде

123456
 sum_of_digits = lambda num: sum(int(digit) for digit in str(num)) 
 
F = lambda n, memo={}: memo[n] if n in memo else (memo.setdefault(n, n * n + 5 * n + 4) if n > 30 else memo.setdefault(n, F(n + 1, memo) + 3 * F(n + 4, memo)) if n % 2 == 0 else memo.setdefault(n, 2 * F(n + 2, memo) + F(n + 5, memo))) 
 
print(sum(1 for n in range(1, 1001) if sum_of_digits(F(n)) == 27) )