задача с литкода №1006

Факториал положительного целого числа — это произведение всех положительных целых чисел, меньших или равных .nn

Например, factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1. Мы делаем неуклюжий факториал , используя целые числа в порядке убывания, заменяя операции умножения на фиксированную ротацию операций с умножением '*', делением '/', сложением '+'и вычитанием '-'в этом порядке.

Например, clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1. Однако эти операции по-прежнему применяются с использованием обычного порядка арифметических операций. Мы выполняем все шаги умножения и деления перед любыми шагами сложения или вычитания, а шаги умножения и деления выполняются слева направо.

Кроме того, мы используем разделение по этажам, такое, что 10 * 9 / 8 = 90 / 8 = 11.

Учитывая целое число n, верните неуклюжий факториал числаn .

Пример 1:

Вход: n = 4 Выход: 7 Объяснение: 7 = 4 * 3/2 + 1 Пример 2:

Вход: n = 10 Выход: 12 Объяснение: 12 = 10 * 9 / 8 + 7 — 6 * 5 / 4 + 3 — 2 * 1

Ограничения:

1 <= n <= 104

вот код

class Solution:

    def clumsy(self, n: int) -> int:
        h = 0
        d = n
        j=n//4
        for i in range(n-1):
            if h==0:
                d*=(n-i-1)
            elif h==1:
                d//=(n-i-1)
            elif h==3:
                h=-1
            h+=1
        d+=j
        return d

ломается после семи


Ответы (1 шт):

Автор решения: MBo

Разобьём сумму на части, начало и хвост удобнее вычислить отдельно:

def clumsy(n: int) -> int:
    mod = n%4
    res = 0
    for t  in range(mod + 4, n-4+1, 4):
        res -= t*(t-1)//(t-2) - t+3
    if n > 3:
        return res + n*(n-1)//(n-2) + n-3 + [0, -1,-2,-6][mod]
    else:
        return [0, 1, 2, 6][mod]

Однако, посмотрев на закономерности:

def clumsy(n: int) -> int:
    return n + ((n//3)*3 if n<=4 else [1,2,2,-1][n&3])
→ Ссылка