Files
SolutionEuler/solutions/0020.FactorialDigitSum/euler_20.py

68 lines
1.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
n! means `n! = n × (n-1) × ... 2 × 1`.
For example, 10! = 10 × 9 × ... × 2 × 1 = 3628800,
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 .
Find the sum of the digits in the number 100!.
"""
import math
import time
from functools import reduce
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Execution time: {end_time - start_time:.8f} seconds")
return result
return wrapper
def large_multiplication(a: str, b: str) -> str:
result = [0] * (len(a) + len(b))
for i in range(len(a) - 1, -1, -1):
carry = 0
for j in range(len(b) - 1, -1, -1):
product = int(a[i]) * int(b[j]) + result[i + j + 1] + carry
result[i + j + 1] = product % 10
carry = product // 10
result[i] += carry
return "".join(map(str, result)).lstrip("0") or "0"
def factorial(n: int) -> int:
res = reduce(lambda x, y: x * y, range(1, n + 1))
return res
@timer
def factorial_digit_sum(n: int) -> int:
if n >= 1000:
fact = math.factorial(n)
else:
fact = factorial(n)
return sum(int(digit) for digit in str(fact))
@timer
def large_factorial(n: int) -> int:
result = "1"
for i in range(2, n + 1):
result = large_multiplication(result, str(i))
print(f"{n}!={result}")
sum_all = sum(int(digit) for digit in result)
return sum_all
def main():
print(factorial_digit_sum(100))
print(large_factorial(100))
if __name__ == "__main__":
main()