Задать вопрос
@msqt14

Пытаюсь пропустить число 10 двумя способами.(правильный второй код) Почему эти два кода дают разный результат?

№23 в КИМ

Исполнитель преобразует число на экране.

У исполнителя есть две команды, которым присвоены номера:

1. Прибавить 1

2. Умножить на 2

Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд.

Сколько существует программ, для которых при исходном числе 1 результатом является число 30, при этом траектория вычислений не проходит через 10?

# код 1
def f(st, end):

    a={st: 1}

    for i in range(st + 1, end + 1):

        a[i]=0

        if i - 1 in a:

            a[i]+=a[i - 1]

        if i % 2 == 0 and int(i//2) in a:

            a[i]+=a[int(i//2)]

    return a[end]

print(f(1,9)*f(11,30))


# код 2
def f(st, end, propusk):

    a={st: 1}

    for i in range(st + 1, end + 1):

        a[i]=0

        a[propusk]=0

        if i - 1 in a:

            a[i]+=a[i - 1]

        if i % 2 == 0 and int(i//2) in a:

            a[i]+=a[int(i//2)]

    return a[end]

print(f(1,30, 10))


первый раз пытаюсь дойти от 1 до 9 потом от 11 до 30 тем самым игнорировав 10.(но это почему-то не правильно)

второй раз просто сразу "сказал", что в 10 не ведут пути, каждый раз когда 10 участвует в счёте то оно возвращает 0 (не считаем пути от него)

почему первый код неправильный по сути же я так же не учитываю пути из 10
  • Вопрос задан
  • 281 просмотр
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Не все пути из 1 в 30 ведут через 9.
Например путь 1 -> 2 -> 3 -> 6 -> 7 -> 14 -> 15 -> 30 ваш первый вариант не найдёт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ZeLib0ba
@ZeLib0ba
[ОЙ]ишник
def f(st, end, forbidden):
    a = {st: 1}
    for i in range(st + 1, end + 1):
        a[i] = 0
        if i == forbidden:
            continue  # 10 мимо
        if i - 1 in a:
            a[i] += a[i - 1]
        if i % 2 == 0 and (i // 2) in a:
            a[i] += a[i // 2]
    return a[end]

print(f(1, 30, 10))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы