python — Как вычислить сумму 1!+2!+3!+…+n!
Вопрос задан
Изменён 6 месяцев назад
Просмотрен 27k раза
Условие задачи:
По данному натуральном n вычислите сумму 1!+2!+3!+…+n!. В решении этой задачи можно использовать только один цикл. Пользоваться математической библиотекой math в этой задаче запрещено.
n = int(input()) N = 1 sum = 0 for a in range(1, n+1): for b in range(1, a+1): N = N * b sum += N print(sum)
Однако у меня решение не выходит. Подскажите, как решить правильно?
- python
- python-3.x
- ряды
1
Если на вход подаются только натуральные n
, то можно так:
n = int(input()) sum_of_factorials = 1 curr_factorial = 1 for i in range(2, n + 1): curr_factorial *= i sum_of_factorials += curr_factorial print(sum_of_factorials)
(Вам же нужно 1!+2!+3!+.
? Или вы не опечатались? Если нет, то ..+n!
sum_of_factorials
просто на 2
домножить в конце и отнять 1
).
Это весьма простое динамическое программирование. Вам не нужно каждый раз заново вычислять curr_factorial
, чтобы его прибавить, т.к. нынешний curr_factorial
— это просто старое значение, домноженное на номер текущего цикла итерации.
0
n = int(input()) suma = 0 previous = 1 # Предыдущий факториал for i in range(1, n + 1): current = previous * i # Текущий факториал - см. примечание после кода suma += current previous = current print(suma)
Здесь используется факт, что факториал числа равен факториалу предыдущего числа умноженный на текущее число — например 5! == 4! * 5
, потому что
5! == 1 * 2 * 3 * 4 * 5 == (1 * 2 * 3 * 4) * 5 == 4! * 5
number = int(input()) spicok = list(range(1,number+1)) factorial_current=1 summa=0 for n in spicok: factorial_current = factorial_current*n summa += factorial_current print(summa)
n = int(input()) s = 0 res = 1 for i in range (1, n+1): res *= i s = s + res print(s)
1
Можно было решать, используя библиотеку math.
from math import factorial n = int(input()) sum = 0 for i in range(1, n+1): sum += factorial(i) print(sum)
3
Предлагаю начать с конца:
n = int(input()) s = 0 for i in range(n, 0, -1): s = (s+1) * i print(s)
или
from functools import reduce n = int(input()) print(reduce(lambda s, i: (s+1) * i, range(n, 0, -1)))
Эту задачу можно решить, используя вложенный цикл:
res1 = 1 res2 = 0 number = int(input('Введите число: ')) for i in range(1, number + 1): for j in range(1, i + 1): res1 *= j res2 += res1 res1 = 1 print(res2)
Он был так близок !!!
n = int(input("Введите факториал : ")) f=1 summ=0 for i in range(2, n+1): for j in range (1,i+1): f = f * j summ+=f print("Ваш факториал равен =",summ) # (ввод - 5)(вывод - 34 560 )
1
numberN = int(input("Введите число N: ")) while numberN < 0: # фильтр отриц.чисел numberN = int(input('Число N < 0. Введите N >= 0: ')) factorial = 1 total = 0 for numbers in range(1, numberN + 1): factorial *= numbers total += factorial if total == 0: # исключение для N = 0 total = 1 print(total)
1
from math import factorial print(f"{factorial(int(input()))}")
так не проще?
1
Мне нравится включать Python в мои исследования функций, однако я столкнулся с поведением, которого я не ожидал или не хотел для этих оценок.
>>> определение ч(х): ... вернуть -1 / х**(1/3) ... >>> ч(-343) (-0,07142857142857145 + 0,12371791482634838j)
Мне нужна настоящая обратная функция для следующей функции:
>>> def f(x): ... вернуть х**3 ... >>> f(-7) -343
Такой, что:
>>> определение ч(х): ... вернуть -1/inverse_f(x) ... >>> ч(-343) 0,14285714285714285
Есть ли способ Pythonic добиться такого поведения?
- питон
- математика
- возведение в степень
8
У вас возникают проблемы, потому что отрицательное число, возведенное в дробную степень, может быть комплексным числом.
Решение состоит в том, чтобы применить математическую идентичность. Мы знаем, что если x является отрицательным, тогда x 1/3 равно -((- x ) 1/3 ). Другими словами, мы превращаем x в положительное число, извлекаем кубический корень и снова отрицаем его. Вот код Python для этого:
def h(x): если х >= 0: возврат -1,0/х**(1,0/3,0) иначе: # х < 0 вернуть -ч(-х)
Чтобы объяснить, почему вы сталкиваетесь с проблемой, полезно взглянуть на реализацию х**у
(энергетик). Ключевое математическое тождество состоит в том, что x y = exp(log( x ) · y ). Это тождество упрощает работу со степенями, потому что показатель степени рассматривается как обычное число и не нуждается в анализе (целое ли это число? дробное число? отрицательное число? и т. д.).
Когда x является положительным числом, log( x ) является действительным числом. Поскольку y также является действительным числом, exp(log( x ) · y ) будет действительным числом.
Но когда x является отрицательным числом, log( x ) является комплексным числом. В частности, оно равно [log(- x ) + π · i ]. Когда мы умножаем такое комплексное число на y , а затем применяем exp(), результатом обычно будет комплексное число, а это не то, на что вы надеялись.
, если вы хотите работать только с целыми числами (и игнорировать сложные решения вашей функции), это может быть способом.